Java Web Servlet 继承结构和生命周期

Java Web Servlet 继承结构和生命周期

继承结构

继承关系如下图所示

image-20220525220651614

抽象类Servlet有以下接口,其中init(),service(),destroy()三个主要方法。其中init是servlet初始化用,service为接收http请求用,destroy为servlet销毁时调用的接口

public interface Servlet {
    void init(ServletConfig var1) throws ServletException;

    ServletConfig getServletConfig();

    void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;

    String getServletInfo();

    void destroy();
}

GenericServlet添加了一些与配置有关的方法。

HttpServlet实现了Service方法,根据请求的状态调用对应的do方法进行处理。

image-20220525220630582

生命周期

通常情况下,tomcat在启动时不会初始化servlet,而是在用户进行调用时才会进行对应Servlet的初始化操作,这样可以提高服务器的启动速度。

类的构建是通过tomcat反射构造方法进行构造。

之后调用init方法进行初始化。

通过service方法进行对请求的处理。

只有在tomcat容器关闭的时候Servlet才会被销毁。

Servlet是单例、线程不安全的。

测试

public class LifeServlet extends HttpServlet {

    public LifeServlet(){
        System.out.println("构造。。。");
    }

    @Override
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        System.out.println("一次服务");
        super.service(req, res);
    }

    @Override
    public void destroy() {
        System.out.println("销毁");
        super.destroy();
    }

    @Override
    public void init() throws ServletException {
        System.out.println("初始化");
        super.init();
    }
}

启动tomcat,可以看到在启动的时候LifeServlet并未被初始化,通过页面访问该Servlet

image-20220525222148834

可以看到tomcat实例化了该类并进行服务

image-20220525222330394

刷新页面也只会重新调用service方法而不会重新构造Servlet。

image-20220525222414109

关闭容器,可以看到Servlet被销毁了。

image-20220525222446979

启动容器时就加载类

上面说到,在调用是再初始化类会提高服务器启动的速度,但是会降低用户第一次访问的质量。

如果要想在容器启动的时候就初始化类需要在web.xml中增加一条配置

<servlet>
    <servlet-name>LifeServlet</servlet-name>
    <servlet-class>com.javawebdemo.LifeServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

load-on-startup里的数字为加载优先级,数字越小优先级越高,最小为0。

posted @ 2022-05-25 22:56  Mr耀  阅读(77)  评论(0)    收藏  举报