load-on-startup Servlet 启动优先级

     最近闲来无聊,测试了下 load-on-startup 关于 Servlet 的优先级。看到网上有些帖子说,load-on-startup 的取值 0 或 负整数时,在启动 Tomcat 时,Servlet 就会优先被加载(取负时会 默认成0),经过本人测试,当 load-on-startup 取0 时,Servlet 会优先被加载,但是取负值时,Tomcat 不会加载Servlet 。

     另外就是,看到有人说 当load-on-startup 取值 为 异常值(如 浮点数、字符串等)时,xml 会报错,但是仍然可以正常启动项目,底层 会有一些处理,将 异常数据 设置为0,Tomcat 会优先加载 异常的Servlet。但是当我测试的时候发现,如果出现异常,Tomcat 不会加载 异常的Servlet。

接下来是网上的一些说法:

1)load-on-startup 元素标记容器是否应该在启动的时候加载这个servlet,(实例化并调用其init()方法)。

2)它的值必须是一个整数,表示servlet应该被载入的顺序

3)如果该元素不存在或者这个数为负时,则容器会当该Servlet被请求时,再加载。

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

5)正数的值越小,该servlet的优先级越高,应用启动时就越先加载。

6)当值相同时,容器就会自己选择顺序来加载。(当然我写了几个测试程序,没有抓住它的规律性,我们暂且理解为容器自主选择!)


以下是小编 亲自测试后的结果:

首先创建了5个Servlet S1-S5

然后在web.xml 中注册,并进行测试:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>webXml</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
  	<servlet-name>S1</servlet-name>
  	<servlet-class>com.web.servlet.S1</servlet-class>
  	<load-on-startup>1</load-on-startup>
  </servlet>
  <servlet>
  	<servlet-name>S2</servlet-name>
  	<servlet-class>com.web.servlet.S2</servlet-class>
  	<load-on-startup>2</load-on-startup>
  </servlet>
  <servlet>
  	<servlet-name>S3</servlet-name>
  	<servlet-class>com.web.servlet.S3</servlet-class>
  	<load-on-startup>3</load-on-startup>
  </servlet>
  <servlet>
  	<servlet-name>S4</servlet-name>
  	<servlet-class>com.web.servlet.S4</servlet-class>
  	<load-on-startup>4</load-on-startup>
  </servlet>
  <servlet>
  	<servlet-name>S5</servlet-name>
  	<servlet-class>com.web.servlet.S5</servlet-class>
  	<load-on-startup>5</load-on-startup>
  </servlet>
  
  <servlet-mapping>
  	<servlet-name>S1</servlet-name>
  	<url-pattern>/s1</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
  	<servlet-name>S2</servlet-name>
  	<url-pattern>/s2</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
  	<servlet-name>S3</servlet-name>
  	<url-pattern>/s3</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
  	<servlet-name>S4</servlet-name>
  	<url-pattern>/s4</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
  	<servlet-name>S5</servlet-name>
  	<url-pattern>/s5</url-pattern>
  </servlet-mapping>
</web-app>
(1)首先  按照S1-S5 设置优先级为 由小到大的整数,修改了多次优先级进行测试;

 测试结果都是:

  

 显而易见,按照 正整数 进行设置 优先级,数字小的 优先级 高于 数字大的 优先级。

(2)接下来 测试 0 与 负整数(S1=1,S2=0,S3=6,S4=3,S5=2)

  测试结果 按照优先级0,1,2,3,6 加载顺序加载Servlet,证明0 优先加载。

然后 测试负数(S1=5,S2=0,S3=-2,S4=-4,S5=3)


Tomcat 加载结果 S2,S5,S1(优先级 0,3,5 ),Tomcat 并 没有 加载 优先级 为 负数 的Servlet,只是加载了三个 优先级

取值为 非负数 的Servlet。证明 当load-on-startup 取值为负整数时,Tomcat 不会报错,能够正常启动,但是Servlet 不能

被初始化。

(3)接下来 测试 异常值(浮点数、字符串等):(S1=0,S2=X,S3=2.3,S4=12,S5=6)

在编译阶段,load-on-startup 取值 字符串 和 浮点数,两个Servlet 配置都报错,其他三个正常,启动后 Tomcat 发生异常,

并且 五个Servlet 没有一个初始化成功,Tomcat 无法正常启动。结果显而易见,Tomcat 底层不会 将异常值 赋值 0并成功初

始化Servlet,而是 Tomcat 根本就不能初始化 Servlet。

(4)接下来测试 当多个Servlet 优先级值相同时,Tomcat 会按照什么顺序 初始化Servlet 呢?

我将 S1-S5 优先级全部设置成 1、2、3、4、5分别进行测试,结果,优先级相同的情况下,S1、S2最后被加载,其他的按照顺序

进行加载。不信邪的我又添加了两个Servlet ,结果还是 S2最后被初始化,S1倒数第二被初始化,其他的按照顺序 从上到下进行

初始化。


然后我又 将 xml 中 Servlet 的顺序按照 S1,S4,S3,S2,S7,S5,S8 的顺序调整了下,还是 S3,S4,S5,S7,S8,S1,S2的初始化顺序。

然后 我又 将 Servlet-mapping 的顺序打乱了,再启动,发现 Servlet 初始化顺序没有发生变化。

后来 我又 测试了 只剩下S1,S3,S5;  S1,S2,S3; S2,S4,S5; S4,S5,S6 几组测试,发现 初始化顺序 都是按照 S2最后

初始化,S1 倒数第二初始化,其他的按照数字从小到大初始化。测试时将 映射顺序也打乱了,结果还是这个规律,但是具体是

为什么,小编也不清楚,网上搜了下也没得到想要的答案,如果有大神知道原因请不吝赐教,万分感谢。

(4)接下来手下 <load-on-startup></load-on-startup> 这种情况,网上有人说这种情况会当成 0 优先级 在Tomcat 启动

时最优先被加载,结果 小编测试了下,结果是 Tomcat 启动异常,所有 Servlet 都不能被初始化。

(5)关于取值范围,小编测试了下,将 Servlet 优先级设置成十几位,依然能够正常初始化,所有下边总结了下

load-on-startup的取值问题:

①、非负的整型:优先级按照 优先初始化 0 级别,数字越大初始化越靠后,也就是数字小的优先初始化。

②、相同级别的:S3--.... S1,S2 的顺序,具体原因由于时间问题 没具体搞清楚,以后有时间弄懂了会补上。

③、异常值:优先级 取值异常时,Tomcat 不会赋值 0,而是报 启动异常,不能正常初始化 Servlet。

④、<load-on-startup></load-on-startup>这种昂情况也不能正常启动Tomcat







  • 30
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值