Servlet总结(三)

来源:互联网 发布:淘宝店铺掌柜名怎么改 编辑:程序博客网 时间:2024/06/05 13:32

Servlet的生命周期

在Servlet为客户端提供服务的整个过程中在服务器内部只有一个对象。

生命全过程:

1)加载ClassLoader

2)实例化 new(客户端的第一次请求过来时,Tomcat调用构造方法,实例化一个Servlet,且只实例化一次)

3)初始化 init(ServletConfig) (Tomcat调用此方法,若重写此方法,可以自己设置一些初始化信息,也只调用一次

4)处理请求 service doGet doPost:

以多线程的方法处理客户端的请求(线程池)

“线程池”:提前准备若干个线程(先跑起来,闲着),当客户端的一个请求过来时,Tomcat分配一个闲的线程来处理

这个请求,当第二个请求过来时,Tomcat分配另外一个闲的线程处理这个请求,...... 。每个线程都是访问同一个Servlet对象。通过这个对象的引用调用Service()方法。

5)退出服务destroy()  (Web应用程序退出或Tomcat重新加载时调用,以关闭打开的资源)

至此Servlet的生命周期结束了。

下面用一个小程序来模拟一下一个Servlet的生命周期:

import java.io.*;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class TestLifeCycleServlet extends HttpServlet{@Overridepublic void destroy() {System.out.println("destroy...");}@Overridepublic void init() throws ServletException {System.out.println("init...");}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {System.out.println("doGet...");}public TestLifeCycleServlet(){System.out.println("Constructor!");//用来观察TestLifeCycleServlet何时被创建}}


说明:

1)当启动Tomcat时不会打印Constructor!。

2)当从浏览器输入localhost:8080/myproject/tao时,即收到客户端的一个请求时,首先实例化,打印Constructor!

然后调用init()打印init...,然后调用protected service(),转而调用doGet()打印doGet...,再次刷新网页(一共刷新4次),即多个客户端请求,可以看到,并没有实例化Servlet,而且也没有再调用init()。而是调用doGet()方法,所

以又打印了4次doGet...

3)然后我重启我把destroy()方法中的System.out.println("destroy...")改为:System.out.println("Game over!"),因为你的例的内容发生了变化,Tomcat帮你重新加载一下,这时可以看到打印了destroy...----表示当前Servlet的第一个生命周期已结束。



原创粉丝点击