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{
@Override
public void destroy() {
System.out.println("destroy...");
}
@Override
public void init() throws ServletException {
System.out.println("init...");
}
@Override
protected 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的第一个生命周期已结束。