如题,默认的servlet是单例模式的,即一旦某个action被加载了,那么整个服务器启动期间就不会再次重复加载。我觉得这样虽然减轻了服务器负担,但是在某些情况下,例如某次请求中设置了成员变量a=10,那么下次请求过来时,若request中不包含对a的重新设置,那么a依旧是10,这就很可能造成冲突。那么如何让每次请求时都重新构造一个新的实例?或者说,这个问题如何解决(不要说将a该成局部变量,因为我要使用a的get,set方法;也不要说请求结束后将a初始化,这只能解决一时的问题)谢谢了~~~

解决方案 »

  1.   

    有必要吗?某次请求中设置了成员变量a=10
    放SESSION不就好了,保证了不同用户访问到的都是自己的a如果真的要其他request 都能访问不就是公共变量? 那就不存在冲突
      

  2.   

    servlet的生命周期应该不是在服务期间一直维持的。请求来请求回后就销毁了,下次请求再重新生成实例。
      

  3.   

    你没明白我的意思,假若成员变量a标示新闻类型,若a为空时则表示是所有新闻,第一次某人进入到了娱乐新闻,设置a=10,第二次另外一人查看所有新闻,这时在request中就不会附带变量a,但是因为这两次请求使用的是同一个对象,那么第二个人虽然要查看所有新闻,但我们服务器a依旧是10,结果给指向娱乐新闻了。其实以前a是局部变量,在变量比较多的情况下,写了一大堆的类似request.getParameter("a"),后来在doGet和doPost中通过反射机制一次性解决了,但要求a必须是成员变量,因此这个问题就来,产生冲突了。
      

  4.   


    Servlet默认是单例模式的,我也试过了,第一次设置了一个成员变量command="list",第二次我在request.getParameter("command")之前,查看command,发现它依旧是"list",郁闷死我了。
      

  5.   

    把业务逻辑从Servlet中移除,放到一个叫做XXXService的类里,每次doGet的时候创建一个此XXXService的实例,通过反射向此XXXService实例属性赋值。
      

  6.   

    如果一定要这么定义那就没办法了,知道servlet是单例还要去这样定义变量a肯定出现问题....
      

  7.   


    额,虽然你这个方法可以解决这个问题,但对于我这次项目而言并不适合,呵呵,先谢谢了。最好能提供tomcat + Servlet的多例模式配置方法,如果嫌分数少了,我可以开贴再送分~~~
      

  8.   


    其实项目一开始时定义成局部变量的,看着那么一大堆的request.getParameter的头痛,项目比较小,就没用到什么SSH了,然后我就干脆一次性解决了。说实话,我09年才毕业,也就是到公司后才接触Web项目的,底子薄,前几个项目一直用的是SSH架构,从来就没想到过Servlet是单例的,然后就出问题了
      

  9.   

    我还怕描述不清楚,简单的说就是如何配置Servlet的多例模式,服务器是tomcat
      

  10.   

    Servlet 实现接口 SingleThreadModel