偶然的发现了一个很基础的问题:原来似乎每个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()函数,可是不知道该往里写什么。
写了如下测试代码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()函数,可是不知道该往里写什么。
解决方案 »
- 请问谁有struts2 in action的中文pdf?急!
- Servlet和applet的HTTP通信问题,applet 无法绘制传回数据,急!!!
- 如何在struts的ActionForm的构造函数里取得session的值?
- 请问:java.sql.SQLException: Closed Connection 是因为什么?
- 一个简单的问题,请大虾指点。
- 我得javascript怎么不执行
- 如何配置tomcat5.0???很急请高手指教!
- 关于 Tomcat连接池中 URL的配置(在线等)
- 好像有点幼稚的问题:在“注销”时应该作些什么事?
- 这样合不合理????? 我看过一个例子,jsp + servlet实现
- 一个产品按照功能分成多个版本,并且不想拆开来开发,有什么好的办法呢?
- 各位帮个忙,是关于动态更新的问题!!谢谢了
2、服务器关闭的时候会销毁servlet实例,调用它的destroy方法。
在个别Servlet初始化的时候可以在xml中通过<load-on-startup>来控制首先执行,调用那里的构造方法.
我曾经写了一个初始化的servlet,更改初始化值后再次调用这个servlet并没有产生改变.
1. 如果这个servlet的实例不存在,容器会
1.加载这个servlet类
2.创建这个类的实例
3.调用这个servlet实例的init方法去初始化这个servlet
2. 调用这个实例的serviec方法,参数是request和response对象。
如果容器需要移除servlet(例如当容器需要回收内存资源或者容器被关闭),它会调用servlet的destory方法。这个方法会释放这个servlet用的所有资源和保存所有回归状态。
从服务器启动开始,你的servlet实例最多创建一个,当你第一次使用这个servlet 的时候创建
关闭服务器的时候销毁。