我有一个商品清单的action。下面叫category?keyword=手机<action name="category" class="categoryAction">
   <result name="success">/WEB-INF/jp/category.jsp</result>
    </action>
 
 <bean id="categoryAction" class="com.x.action.CategoryAction">
<property name="dao" ref="dao">
</bean>
    下面这个pageBar就是一个分页数,内容为:1 2 3 4 5
public class CategoryAction{
private List list;
private StringBuilder pageBar;
public String execute(){ 
pageBar=new StringBuilder();//这里会给这些对象放数据
list=new ArrayList();//从数据库查出数据。
}
}这里有两个用户
同时访问category 这个action当第一个用记点击第二页,第二个用户点击第三面,这时候,2个用户都同时显示第二页,也可能同时出现在第三页。给我的感觉是没有同步线程。可是网上都是这样做的。

解决方案 »

  1.   

    你在那个bean配置里加一个scope="prototype"试试。
      

  2.   

    我在
    public String execute(){ 
    //加了sleep之后 ,更加明显两个线程同时进入。也同时退出。
    try {
    Thread.currentThread().sleep(300l);
    } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
            pageBar=new StringBuilder();//这里会给这些对象放数据
    list=new ArrayList();//从数据库查出数据。
    }
    怎么会这样。
      

  3.   

    希望能给我多一些建设 ,我很多action都没有加的。
      

  4.   

    是在bean里加。scope默认的值是singleton,表示只生成一个实例。而prototype是每一次从spring获取实例都是独立而且新的。action不是线程安全的,要求在多线程环境下必须是一个线程对应一个独立的实例,不能使用singleton。所以,在Spring配置Webwork Action Bean时,需要加上属性scope=”prototype”或singleton=”false”。 
      

  5.   

    你好,麻烦你再回答最后一个问题因为拦截器里面需要操作bean给注入的dao类。可是别人说了不能把拦截器给bean。所以我只能改成
    //这是spring对象
     <interceptor name="cookie" class="cookieInterceptor"/>
    //这是struts2自己会new的对象
     <interceptor name="cookie" class="com.huayiluo.commonality.CookieInterceptor"/>public class CookieInterceptor extends MethodFilterInterceptor{
    public String doIntercept(final ActionInvocation invocation) throws Exception {
    //我在这里需要查询数据器,检查cookie是不是有历史记录//我怎么样才能调用出hibernate对象,也就是创建一个新的hibernate可以适合在这个ssh结构下。
    }
    }
      

  6.   

    可能有些乱。问题就是我怎么样通过 在一个方法直接 调用spring 管理的hibernate对象意思就是不通过配置文件注入,我想使用代码直接调用。
      

  7.   

    不好意思哦,拦截器我没用过。不过如果你想在action里调用hibernate的话,在action里加一个dao的set方法,然后spring配置文件里用property来注入对象就可以了。
      

  8.   

    Struts 2 的 Action 设计就不像 Struts 1 的 Action 或者 Servlet 那样是单实例了。Struts 2 的 Action 的设计哲学是每次请求来了,都创建一个实例了。因此,其 Action 中可以拥有成员变量。而 Struts 1 Action 或者 Servlet 都是单实例的,因此在他们当中使用成员变量的话就会产生线程安全问题。若将 Struts 2 的 Action 交给 Spring 管理,就需要 Spring 配置时需要配置成 prototype 模式,否则 Spring 默认会是单实例的。如果是单实例的话,那 Action 中的成员变量就成为多线程共享变量了,会产生不正确的结果。
      

  9.   


    写一个类,实现 org.springframework.context.ApplicationContextAware 接口,代码大致如下:import org.springframework.beans.BeansException;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.ApplicationContextAware;public class SimpleApplicationContext implements ApplicationContextAware {    private static ApplicationContext applicationContext;    // 这里涉及对一个静态字段的赋值会有警告,不过由于 Spring 默认采用的是单例,因此这相警告可以忽略
        @SuppressWarnings("static-access")
        @Override
        public void setApplicationContext(ApplicationContext applicationContext)
                throws BeansException {
            this.applicationContext = applicationContext;
        }    public static Object getBean(String beanName) {
            return applicationContext.getBean(beanName);
        }    public static boolean containsBean(String beanName) {
            if(Tools.isBlank(beanName)) {
                return false;
            }
            return applicationContext.containsBean(beanName);
        }    @SuppressWarnings("unchecked")
        public static <T> T getBean(String beanName, Class<T> clazz) {
            return (T)getBean(beanName);
        }    public static <T> T getBean(Class<T> clazz) {
            return applicationContext.getBean(clazz);
        }
    }在 Spring 的配置中加上这句:<bean id="simpleApplicationContext" class="com.test.spring.SimpleApplicationContext" />然后在代码中用 SimpleApplicationContext.getBean(name); 就可以了。Spring 中有两个,一个是 ApplicationContextAware,还有一个是 BeanFactoryAware。我感觉这些都是 Spring 中的基础,像我这种不会 SSH 的人都知道的!
      

  10.   


    谢谢了,我也不会ssh。都没有基础。