servlet的生命周期

servlet的生命周期

Servlet 生命周期指的是,Servlet 对象的创建、Servlet 对象的初始化、Servlet 对象服
务的执行,及最终 Servlet 对象被销毁的整个过程。
servlet生命周期图:

servlet生命周期

Servlet 的整个生命周期过程的执行,均由 Web 服务器负责管理,程序员无法控制其
执行流程。但程序员可以获取到 Servlet 的生命周期时间点,并可以指定让 Servlet 做一些业务相关的事情。

示例代码:

package com.monkey1024.servlet;

import java.io.IOException;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class LifeServlet implements Servlet {

    public LifeServlet(){
        System.out.println("无参构造方法执行");
    }

    @Override
    public void destroy() {
        System.out.println("执行destroy方法");
    }

    @Override
    public void init(ServletConfig arg0) throws ServletException {
        System.out.println("执行init方法");
    }

    @Override
    public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
        System.out.println("执行service方法");
    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public String getServletInfo() {
        return null;
    }
}

上面代码的运行需要注意下面几个时间点:

  1. 项目部署后启动服务器,并没有执行 Servlet 的无参构造器方法,说明在 Web 容器启动时并没有创建 Servlet 对象。
  2. 用户提交请求URL后,马上可以看到无参构造方法、init()方法、service()方法均执行。
  3. 刷新页面,发现只会执行 service()方法,每刷新一次,即每提交一次请求,就会执行一次 service()方法。
  4. 让另外一个浏览器也发出同样的请求,会发现只执行 service()方法,而无参构造方法、 init()
    方法均未执行。
  5. 正常关闭 Tomcat(使用 stop server 关闭,不能使用 Terminate 关闭),发现 destroy()方
    法也会执行。

servlet的特征

  • Servlet是单例多线程的,只创建一个servlet对象,但是每次请求都会起一个线程并在自己线程栈内存中执行service方法。
  • 一个 Servlet 实例只会执行一次无参构造器与 init()方法,并且是在第一次访问时执行。
  • 用户每提交一次对当前 Servlet 的请求,就会执行一次 service()方法。
  • 一个 Servlet 实例只会执行一次 destroy()方法,在应用停止时执行。
  • 由于 Servlet 是单例多线程的,所以为了保证其线程安全性,一般情况下是不建议在 Servlet类中定义可修改的成员变量,因为每个线程均可修改这个成员变量,会出现线程安全问题。
  • 默认情况下,Servlet 在 Web 容器启动时是不会被实例化的。

tomcat启动时创建servlet实例

在tomcat启动时,默认不会创建servlet实例,如果想要让tomcat在启动时创建servlet实例的话,只需要在web.xml中添加load-on-startup标签即可

 <servlet>
      <servlet-name>lifeServlet</servlet-name>
      <servlet-class>com.monkey1024.servlet.LifeServlet</servlet-class>
      <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
      <servlet-name>lifeServlet</servlet-name>
      <url-pattern>/life</url-pattern>
  </servlet-mapping>

添加load-on-startup的作用是,标记是否在 Tomcat启动时创建并初始化这个 Servlet实例。它的值必须是一个整数。

  • 当值大于等于 0 时,表示容器在启动时就加载并初始化这个 Servlet,数值越小,该 Servlet的优先级就越高,其被创建的也就越早;
  • 当值相同时,容器会自己选择创建顺序。