Servlet的生命周期

从第一次调用,到服务器关闭。期间如果删除加载好的servlet,依然能正常使用。因为,servlet已经加载到了tomcat服务器中。此时如果关闭掉服务器重启服务器,则不能使用删除掉的servelt,tomcat无法找到此servlet并将其加载到服务器中。

如果在web.xml 中配置了load-on-startup则是从服务器开启到服务器关闭(只是调用servlet的init()方法)。。

Servlet的方法

  • service()是真正处理请求的方法
  • init()是对Servlet进行初始化的一个方法,会在Servlet第一次加载进行存储时执行
  • destory()是在servlet被销毁时执行,也就服务器关闭时。

web.xml中servlet配置load-on-startup的作用

在servlet的配置当中,1的含义是:标记容器是否在启动的时候就加载这个servlet。

当值为0或者大于0时,表示容器在应用启动时就加载这个servlet;

当是一个负数时或者没有指定时,则指示容器在该servlet被选择时才加载。(相当于没写,没使用load-on-startup,此时servlet的生命周期没有发生改变)

正数的值越小,启动该servlet的优先级越高。

如果我们在web.xml中设置了多个servlet的时候,可以使用load-on-startup来指定servlet的加载顺序,服务器会根据load-on-startup的大小依次对servlet进行初始化。不过即使我们将load-on-startup设置重复也不会出现异常,服务器会自己决定初始化顺序。

配置load-on-startup后,servlet在startup后立即加载,但只是调用servlet的init()方法,用以初始化该servlet相关的资源。初始化成功后,该servlet可响应web请求;

如未配置load-on-startup,容器一般在第一次响应web请求时,会先检测该servlet是否初始化,如未初始化,则调用servlet的init()先初始化,初始化成功后,再响应请求。

PS:一般我们在开发web应用时,都会配置这个参数,有两个好处:

  • 1、如果初始化过程失败,则容器会提示启动失败,此时我们能够提前知道相关错误;
  • 2、配置该参数相当于将初始化servlet的工作转移到容器启动过程,使得容器只要启动成功后,就可立即响应web请求。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    package com.kylin.servlet;

    import java.io.IOException;

    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;

    /**
    * * Servlet的生命周期:
    * 1、从第一次调用到服务器关闭。
    * 2、如果Servlet在web.xml中配置了load-on-startup,生命周期为 从服务器启动到服务器关闭
    * 注意:
    * init方法是对Servlet进行初始化的一个方法,会在Servlet第一次 加载进行存储时执行
    * destory方法是在servlet被销毁时执行,也就服务器关闭时。
    * @author kylin
    *
    */
    public class ServletLife extends HttpServlet {

    //初始化方法,在servlet第一次加载内容的时候被调用
    @Override
    public void init() throws ServletException {
    System.out.println("servlet初始化完成");
    }



    //service方法,真正处理请求的方法
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    resp.getWriter().write("servlet life");
    System.out.println("servlet life");
    }

    @Override
    public void destroy() {

    System.out.println("我被销毁了!");
    }
    }