Servlet生命分为四个阶段:

1.加载

   这个阶段由Servlet容器完成。例如tomcat,jetty等。当容器加载一个Servlet后不会立刻实例化它。通常是在用户第一次请求是完成实例化操作。

2.实例化和初始化

   在Servlet实例化之后它会调用它的init()方法,在这个方法里可以写上所需的初始化参数,并且该方法只会被调用一次。

*需要注意的是容器创建Servlet实例是通过java反射机制创建的,调用的是默认构造函数,所以编写Servlet类时通常不应提供带参数的构造方法。

3.请求处理

   所有的请求都会走service()方法,无论是get请求还是post请求。但是通常情况下你不必关心service方法,你只需要重写HttpServlet类的doGet方法或者doPost方法处理对应的请求。在HttpServlet类中它实现了判断用户请求类型并交给对应的方法进一步处理。

4.服务终止

   当容器检测到Servlet实例被销毁时,就会调用destroy()方法。

194820792.png

图 1 Servlet生命周期示意图


*注意:上图中的第2和第3步都是处理用户请求,其实可算做一步。每个request请求都会调用service方法,service方法再解析报头,将请求交给doGet或doPost方法处理。


多的就不说了,上代码

public class TestServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
                                                                                                                                                
    public TestServlet() {
        super();
        System.out.println("构造方法运行");
    }
    public void init(ServletConfig config) throws ServletException {
        System.out.println("初始化方法运行");
    }
    public void destroy() {
        System.out.println("Servlet销毁");
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("doGet方法调用");
        response.getWriter().write("Success!");
    }
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        System.out.println("Service方法调用");
        super.service(request, response);
    }
}

配置好web.xml

<servlet>
  <description></description>
  <display-name>TestServlet</display-name>
  <servlet-name>TestServlet</servlet-name>
  <servlet-class>org.test.TestServlet</servlet-class>
</servlet>
<servlet-mapping>
  <servlet-name>TestServlet</servlet-name>
  <url-pattern>/test</url-pattern>
</servlet-mapping>


启动tomcat,在浏览器中输入http:localhost:8080/testweb/test

控制台输出为

================================

构造方法运行

初始化方法运行

Service方法调用

doGet方法调用

================================


   我的eclipse是设置的热部署,当修改Testservlet时,保存就会重新部署,就会看到destory方法被调用了。

212139974.png


  Servlet可以设置在web容器启动是就加载并初始化,只要在web.xml里加上<load-on-startup>1</load-on-startup>这个配置,当值为0或者大于0时,表示容器在应用启动时就加载这个servlet,当是一个负数时或者没有指定时,则只是容器在该servlet被选择时才加载。还有就是配置的正数值越小优先级越高。

<servlet>
  <description></description>
  <display-name>TestServlet</display-name>
  <servlet-name>TestServlet</servlet-name>
  <servlet-class>org.test.TestServlet</servlet-class>
  <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
  <servlet-name>TestServlet</servlet-name>
  <url-pattern>/test</url-pattern>
</servlet-mapping>

214117835.png

servlet生命周期基本就是这样子了。嘿嘿