标签:
写一个类TestLifeCycleServlet,生成构造器TestLifeCycleServlet();重写HttpServlet的doGet();重写GenericServlet的destroy(); init(); 故意打乱顺序,看后台打印结果,看他们的执行顺序。
1 package servlet_01; 2 3 import java.io.IOException; 4 5 import javax.servlet.ServletConfig; 6 import javax.servlet.ServletException; 7 import javax.servlet.http.HttpServlet; 8 import javax.servlet.http.HttpServletRequest; 9 import javax.servlet.http.HttpServletResponse; 10 11 public class TestLifeCycleServlet extends HttpServlet{ 12 13 14 public void destroy() { 15 System.out.println("destroy"); 16 } 17 18 19 public void init(ServletConfig config) throws ServletException { //ServletConfig保存的是servlet的配置信息(web.xml里的)
20 System.out.println("init"); 21 } 22 23 24 public TestLifeCycleServlet() { 25 System.out.println("construstor"); 26 } 27 28 29 protected void doGet(HttpServletRequest request, HttpServletResponse response) 30 throws ServletException, IOException { 31 System.out.println("doGet"); 32 } 33 34 35 }
部署到tomcat,访问,然后刷新再访问一次。
可以看到,先调用构造器,构建出对象,然后是init();-->doGet();-->doGet();暂时还没调destroy();两个doGet();说明不管你访问多少次,只构建了一个对象,为你提供服务。J2EE的要求,Servlet就new一个,(省内存)。(有个SingleThreadModel接口,已经废弃了。如果你的Servlet实现了这个接口,每当一个请求过来,就new一个新对象。)在同一个server,同一个container里头,只有一个servlet。init只执行一次,第一次初始化的时候。当webapps退出的时候,调用destroy();
总结:
servlet生命周期
生命全过程:
1 加载:ClassLoader把你的class load进来。
2 实例化:new自己一个对象
3 初始化:调用init(ServletConfig)方法,(一般重写这个带参的,就调用这个)
4 处理请求:不断地处理请求,一般是对外的service (对于HttpServlet来说就是doGet或者doPost)
5 退出服务:调用destroy();
**只有一个对象对外提供服务,再次访问的时候不会new重新的,不会调用init方法,不会的。
标签:
原文地址:http://www.cnblogs.com/lihaoyang/p/4550938.html