• 控制Servlet启动优先级-10


            load-on-startup 元素是 web.xml 中的一个节点。具体地说,是 servlet 元素的子元素,用来标记 Servlet 容器启动时是否初始化当前 Servlet,以及当前 Servlet 的初始化顺序。

            load-on-startup 元素的取值规则如下:

    • 它的取值必须是一个整数;
    • 当值小于 0 或者没有指定时:则表示容器在该 Servlet 被首次请求时才会被加载;
    • 当值大于 0 或等于 0 时:表示容器在启动时就会加载并初始化该 Servlet,取值越小,优先级越高;
    • 当取值相同时:容器就会自行选择顺序进行加载。

    @WebServlet 注解的 loadOnStartup 属性与 web.xml 中的 load-on-startup 元素相对应,取值的规则和含义相同。

    1、示例

            下面通过一个示例进行说明:

    1)在 servletDemo 项目的 com.hoperun.www 包中,创建名称为 MyServletTestLoadOnStartUp 的类,代码如下:

    1. package com.hoperun.www;
    2. import java.io.IOException;
    3. import jakarta.servlet.ServletException;
    4. import jakarta.servlet.http.HttpServlet;
    5. import jakarta.servlet.http.HttpServletRequest;
    6. import jakarta.servlet.http.HttpServletResponse;
    7. public class MyServletTestLoadOnStartUp extends HttpServlet {
    8. private static final long serialVersionUID = 1L;
    9. @Override
    10. public void init() throws ServletException {
    11. System.out.println(this.getServletName() + ": 初始化完成!");
    12. }
    13. protected void doGet(HttpServletRequest request, HttpServletResponse response)
    14. throws ServletException, IOException {
    15. }
    16. protected void doPost(HttpServletRequest request, HttpServletResponse response)
    17. throws ServletException, IOException {
    18. doGet(request, response);
    19. }
    20. @Override
    21. public void destroy() {
    22. System.out.println(this.getServletName() + ": 销毁!");
    23. }
    24. }

    2)web.xml 的配置如下:

    1. "1.0" encoding="UTF-8"?>
    2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xmlns="https://jakarta.ee/xml/ns/jakartaee"
    4. xmlns:web="http://xmlns.jcp.org/xml/ns/javaee"
    5. xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd http://xmlns.jcp.org/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    6. id="WebApp_ID" version="5.0">
    7. <display-name>servletDemodisplay-name>
    8. <servlet>
    9. <servlet-name>MyServletTestLoadOnStartUp3servlet-name>
    10. <servlet-class>com.hoperun.www.MyServletTestLoadOnStartUpservlet-class>
    11. <load-on-startup>0load-on-startup>
    12. servlet>
    13. <servlet>
    14. <servlet-name>MyServletTestLoadOnStartUp2servlet-name>
    15. <servlet-class>com.hoperun.www.MyServletTestLoadOnStartUpservlet-class>
    16. <load-on-startup>1load-on-startup>
    17. servlet>
    18. <servlet>
    19. <servlet-name>MyServletTestLoadOnStartUp1servlet-name>
    20. <servlet-class>com.hoperun.www.MyServletTestLoadOnStartUpservlet-class>
    21. <load-on-startup>2load-on-startup>
    22. servlet>
    23. <servlet>
    24. <servlet-name>MyServletTestLoadOnStartUp4servlet-name>
    25. <servlet-class>com.hoperun.www.MyServletTestLoadOnStartUpservlet-class>
    26. <load-on-startup>-1load-on-startup>
    27. servlet>
    28. <servlet>
    29. <servlet-name>MyServletTestLoadOnStartUp5servlet-name>
    30. <servlet-class>com.hoperun.www.MyServletTestLoadOnStartUpservlet-class>
    31. servlet>
    32. <servlet-mapping>
    33. <servlet-name>MyServletTestLoadOnStartUp1servlet-name>
    34. <url-pattern>/MyServletTestLoadOnStartUp1url-pattern>
    35. servlet-mapping>
    36. <servlet-mapping>
    37. <servlet-name>MyServletTestLoadOnStartUp2servlet-name>
    38. <url-pattern>/MyServletTestLoadOnStartUp2url-pattern>
    39. servlet-mapping>
    40. <servlet-mapping>
    41. <servlet-name>MyServletTestLoadOnStartUp3servlet-name>
    42. <url-pattern>/MyServletTestLoadOnStartUp3url-pattern>
    43. servlet-mapping>
    44. <servlet-mapping>
    45. <servlet-name>MyServletTestLoadOnStartUp4servlet-name>
    46. <url-pattern>/MyServletTestLoadOnStartUp4url-pattern>
    47. servlet-mapping>
    48. <servlet-mapping>
    49. <servlet-name>MyServletTestLoadOnStartUp5servlet-name>
    50. <url-pattern>/MyServletTestLoadOnStartUp5url-pattern>
    51. servlet-mapping>
    52. web-app>

    3)启动Tomcat服务器,控制台显示如下:

    4)在地址栏输入http://localhost:8080/servletDemo/MyServletTestLoadOnStartUp1,访问 MyServletTestLoadOnStartUp1,结果如下图:

    5)在地址栏输入http://localhost:8080/servletDemo/MyServletTestLoadOnStartUp4,访问 MyServletTestLoadOnStartUp4,结果如下图:

    6)在地址栏输入http://localhost:8080/servletDemo/MyServletTestLoadOnStartUp5,访问 MyServletTestLoadOnStartUp5,结果如下图:

    总结:

    • 因为 MyServletTestLoadOnStartUp1、MyServletTestLoadOnStartUp2 和 MyServletTestLoadOnStartUp3 的 load-on-startup 元素取值都大于等于 0,所以在 Tomcat 启动时,就对它们进行了初始化。
    • 在 Servlet 的生命周期内,init() 方法只会被调用一次,因此当 Tomcat 启动完成后,第一次访问 MyServletTestLoadOnStartUp1、MyServletTestLoadOnStartUp2 和 MyServletTestLoadOnStartUp3 时,它们不会再次被初始化,即不会再次调用初始化方法。
    • 由于 MyServletTestLoadOnStartUp4 的 load-on-startup 元素取值为负数,因此只有当第一次请求它时,才会进行初始化。
    • 由于 MyServletTestLoadOnStartUp5  没有指定 load-on-startup 元素取值,因此只有当第一次请求它时,才会进行初始化。
  • 相关阅读:
    记一次 .NET 某新能源材料检测系统 崩溃分析
    秋招每日一题T3——设计循环双端队列
    数据服务器之raid1使用
    C语言实例练习
    Linux(centos)服务器10秒快速配置Java环境
    【LeetCode】摆动排序 [M](数组)
    SpringBoot调取OpenAi接口实现ChatGpt功能
    嵌入式开发需要掌握的u-boot命令
    AWVS的简介与安装
    VsCode高速下载
  • 原文地址:https://blog.csdn.net/weixin_42051619/article/details/127717441