偶然的发现了一个很基础的问题:原来似乎每个servlet只实例化一个对象啊!
写了如下测试代码public class LifeCycle extends HttpServlet {
    private static final long serialVersionUID = 1L;
    int i = 0;                          //一个成员变量,最终发现被所有人共享
    public LifeCycle() {
        super();
        System.out.println("created");  //测试过程中只creat了一次
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
i++;
request.setAttribute("i",""+i);
RequestDispatcher rd = request.getRequestDispatcher("/liftcycle.jsp");
        rd.forward(request, response);
    }
}每访问一次这个servelt就让i+1,结果发现,重复访问多次或者在不同的机器上访问,i都会递增。也就是说这个类只初始化了一次,时间和空间上大家都是共享一个对象!
惭愧啊我这半年白学了
由此产生2个问题:
1.是不是servlet中不能够利用成员变量了,因为大家共享
2.似乎每个servlet被第一次调用之后就保持该对象,请问什么时候这个对象从内存清空呢?还是要手动清空?因为我看到有的servlet模板有destroy()函数,可是不知道该往里写什么。

解决方案 »

  1.   

    1、是这样的。
    2、服务器关闭的时候会销毁servlet实例,调用它的destroy方法。
      

  2.   

    使用ThreadLocal作为servlet的成员变量,不同线程值不同
      

  3.   

    貌似是吧. 
    在个别Servlet初始化的时候可以在xml中通过<load-on-startup>来控制首先执行,调用那里的构造方法. 
    我曾经写了一个初始化的servlet,更改初始化值后再次调用这个servlet并没有产生改变.
      

  4.   

    那么这个destroy()方法需不需要我重写?应该不用管吧?
      

  5.   

    servlet的生命周期是由它所在的容器控制的, 当一个request映射到这个servlet的时候,容易会按照一下步骤进行调用:
       1. 如果这个servlet的实例不存在,容器会
          1.加载这个servlet类
          2.创建这个类的实例
          3.调用这个servlet实例的init方法去初始化这个servlet
       2. 调用这个实例的serviec方法,参数是request和response对象。
    如果容器需要移除servlet(例如当容器需要回收内存资源或者容器被关闭),它会调用servlet的destory方法。这个方法会释放这个servlet用的所有资源和保存所有回归状态。
      

  6.   

    这个是正确的,全面的,destroy()主要用来处理后事,和finally差不多。
    从服务器启动开始,你的servlet实例最多创建一个,当你第一次使用这个servlet 的时候创建
    关闭服务器的时候销毁。