3. 生命周期

1. 生命周期流程

3. 生命周期 - 图1

2. 代码测试

  1. 代码图片.png
  1. import java.io.IOException;
  2. import java.io.PrintWriter;
  3. import javax.servlet.ServletConfig;
  4. import javax.servlet.ServletException;
  5. import javax.servlet.http.HttpServlet;
  6. import javax.servlet.http.HttpServletRequest;
  7. import javax.servlet.http.HttpServletResponse;
  8. public class LoginServlet1 extends HttpServlet {
  9. public LoginServlet1(){
  10. System.out.println("LoginServlet 构造方法 被调用");
  11. }
  12. public void init(ServletConfig config) {
  13. System.out.println("init(ServletConfig)");
  14. }
  15. public void destroy() {
  16. System.out.println("destroy()");
  17. }
  18. protected void service(HttpServletRequest request, HttpServletResponse response)
  19. throws ServletException, IOException {
  20. String name = request.getParameter("name");
  21. String password = request.getParameter("password");
  22. String html = null;
  23. if ("admin".equals(name) && "123".equals(password))
  24. html = "<div style='color:green'>success</div>";
  25. else
  26. html = "<div style='color:red'>fail</div>";
  27. PrintWriter pw = response.getWriter();
  28. pw.println(html);
  29. }
  30. }
  1. 修改web.xml重定向到某个url
  1. <!-- login1登陆界面 -->
  2. <servlet>
  3. <servlet-name>LoginServlet</servlet-name>
  4. <servlet-class>LoginServlet1</servlet-class>
  5. </servlet>
  6. <servlet-mapping>
  7. <servlet-name>LoginServlet</servlet-name>
  8. <url-pattern>/login</url-pattern>
  9. </servlet-mapping>
  1. 效果

图片.png

3. 分析

  1. 实例化3. 生命周期 - 图4
  2. 初始化3. 生命周期 - 图5
  3. 提供服务.

    1. service()方法,然后通过浏览器传递过来的信息进行判断,是调用doGet()还是doPost()方法
  4. 销毁

    接着是销毁destroy() 在如下几种情况下,会调用destroy()

    1. 该Servlet所在的web应用重新启动

在server.xml中配置该web应用的时候用到了

如果把 reloadable=”false” 改为reloadable=”true” 就表示有任何类发生的更新,web应用会自动重启

当web应用自动重启的时候,destroy()方法就会被调用

  1. 关闭tomcat的时候 destroy()方法会被调用,但是这个一般都发生的很快,不易被发现。

4 自启动

4.1 什么叫自启动

  1. 有的时候会有这样的业务需求:

tomcat一启动,就需要执行一些初始化的代码,比如校验数据库的完整性等。
但是Servlet的生命周期是在用户访问浏览器对应的路径开始的。如果没有用户的第一次访问,就无法执行相关代码。
这个时候,就需要Servlet实现自启动 即,伴随着tomcat的启动,自动启动初始化,在初始化方法init()中,就可以进行一些业务代码的工作了。

  1. 简单来说tomcat已启动就实例化这个Servlet类并且调用init方法

4.2 举例没有自启动

  1. 两个Servlet类的init方法
  1. public class HelloServlet extends HttpServlet {
  2. @Override
  3. public void init(ServletConfig config) throws ServletException {
  4. // TODO Auto-generated method stub
  5. super.init(config);
  6. System.out.println("Hello Servlet初始化");
  7. }
  1. public class LoginServlet5 extends HttpServlet {
  2. //自启动
  3. public void init(ServletConfig config) {
  4. System.out.println("LoginServlet初始化");
  5. }
  1. 配置文件
  1. <!-- hello界面 -->
  2. <servlet>
  3. <!-- 当前配置文件中这个class文件取的名字 -->
  4. <servlet-name>HelloServlet</servlet-name>
  5. <servlet-class>HelloServlet</servlet-class>
  6. </servlet>
  7. <servlet-mapping>
  8. <!-- 这个class文件对应的url -->
  9. <servlet-name>HelloServlet</servlet-name>
  10. <url-pattern>/hello</url-pattern>
  11. </servlet-mapping>
  12. <!-- login1登陆界面 -->
  13. <servlet>
  14. <servlet-name>LoginServlet</servlet-name>
  15. <servlet-class>LoginServlet5</servlet-class>
  16. </servlet>
  17. <servlet-mapping>
  18. <servlet-name>LoginServlet</servlet-name>
  19. <url-pattern>/login</url-pattern>
  20. </servlet-mapping>
  1. 效果tomcat启动后访问到该页面才启动图片.png

    4.3 有自启动并且设置了优先级

  2. 只需要为配置文件某个Serlet加上启动优先级,0-99,越小优先级越高。

  1. <!-- hello界面 -->
  2. <servlet>
  3. <!-- 当前配置文件中这个class文件取的名字 -->
  4. <servlet-name>HelloServlet</servlet-name>
  5. <servlet-class>HelloServlet</servlet-class>
  6. <load-on-startup>5</load-on-startup>
  7. </servlet>
  8. <servlet-mapping>
  9. <!-- 这个class文件对应的url -->
  10. <servlet-name>HelloServlet</servlet-name>
  11. <url-pattern>/hello</url-pattern>
  12. </servlet-mapping>
  13. <!-- login1登陆界面 -->
  14. <servlet>
  15. <servlet-name>LoginServlet</servlet-name>
  16. <servlet-class>LoginServlet5</servlet-class>
  17. <load-on-startup>10</load-on-startup>
  18. </servlet>
  19. <servlet-mapping>
  20. <servlet-name>LoginServlet</servlet-name>
  21. <url-pattern>/login</url-pattern>
  22. </servlet-mapping>
  1. 效果:启动时自动初始化

图片.png