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 的类,代码如下:
package com.hoperun.www;
import java.io.IOException;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
public class MyServletTestLoadOnStartUp extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
public void init() throws ServletException {
System.out.println(this.getServletName() + ": 初始化完成!");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
@Override
public void destroy() {
System.out.println(this.getServletName() + ": 销毁!");
}
}
2)web.xml 的配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="https://jakarta.ee/xml/ns/jakartaee"
xmlns:web="http://xmlns.jcp.org/xml/ns/javaee"
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"
id="WebApp_ID" version="5.0">
<display-name>servletDemo</display-name>
<!-- load-on-startup:取值大于等于0 -->
<servlet>
<servlet-name>MyServletTestLoadOnStartUp3</servlet-name>
<servlet-class>com.hoperun.www.MyServletTestLoadOnStartUp</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet>
<servlet-name>MyServletTestLoadOnStartUp2</servlet-name>
<servlet-class>com.hoperun.www.MyServletTestLoadOnStartUp</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet>
<servlet-name>MyServletTestLoadOnStartUp1</servlet-name>
<servlet-class>com.hoperun.www.MyServletTestLoadOnStartUp</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<!-- load-on-startup:取值小于0 -->
<servlet>
<servlet-name>MyServletTestLoadOnStartUp4</servlet-name>
<servlet-class>com.hoperun.www.MyServletTestLoadOnStartUp</servlet-class>
<load-on-startup>-1</load-on-startup>
</servlet>
<!-- load-on-startup:未指定,即默认 -->
<servlet>
<servlet-name>MyServletTestLoadOnStartUp5</servlet-name>
<servlet-class>com.hoperun.www.MyServletTestLoadOnStartUp</servlet-class>
</servlet>
<!-- URL映射 -->
<servlet-mapping>
<servlet-name>MyServletTestLoadOnStartUp1</servlet-name>
<url-pattern>/MyServletTestLoadOnStartUp1</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>MyServletTestLoadOnStartUp2</servlet-name>
<url-pattern>/MyServletTestLoadOnStartUp2</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>MyServletTestLoadOnStartUp3</servlet-name>
<url-pattern>/MyServletTestLoadOnStartUp3</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>MyServletTestLoadOnStartUp4</servlet-name>
<url-pattern>/MyServletTestLoadOnStartUp4</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>MyServletTestLoadOnStartUp5</servlet-name>
<url-pattern>/MyServletTestLoadOnStartUp5</url-pattern>
</servlet-mapping>
</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 元素取值,因此只有当第一次请求它时,才会进行初始化。