控制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 的类,代码如下:

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 元素取值,因此只有当第一次请求它时,才会进行初始化。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值