java Web项目中web.xml中 load-on-startup 标签作用理解
一、问题描述
1、在做java Web项目中,发现web.xml中有一个标签
<load-on-startup>1</load-on-startup>
,发现这个标签中的数值是1,为什么是1呢? 产生了好奇,研究了下。
2、代码参考
<servlet>
<servlet-name>ServerTwo</servlet-name>
<display-name>ServerTwo</display-name>
<servlet-class>com.xx.xx.servlet.ServerTwo</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>ServerTwo</servlet-name>
<url-pattern>/ServerTwo</url-pattern>
</servlet-mapping>
二、问题思考
1、网上查了下,load-on-startup 意思是表示启动时加载,那么 <load-on-startup>
1</load-on-startup> ,是否可以理解为: 启动时立即加载 (“1” 对应boolean值 true)。 <load-on-startup>
0</load-on-startup>:启动时不加载,调用的时候加载呢?
三、代码实验
1、创建一个web项目
2、创建两个Servlet,重写 init 方法,增加一句输出。
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println(this.getClass().getName() +" init success.");
}
3、在web.xml 中配置 Servlet 如下
<servlet>
<servlet-name>ServerOne</servlet-name>
<display-name>ServerOne</display-name>
<servlet-class>com.xx.study.servlet.ServerOne</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet>
<servlet-name>ServerTwo</servlet-name>
<display-name>ServerTwo</display-name>
<servlet-class>com.xx.study.servlet.ServerTwo</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>ServerOne</servlet-name>
<url-pattern>/ServerOne</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>ServerTwo</servlet-name>
<url-pattern>/ServerTwo</url-pattern>
</servlet-mapping>
4、启动 Tomcat ,观察控制台日志输出
com.xx.study.servlet.
ServerOne init success.
com.xx.study.servlet.
ServerTwo init success.
5、日志分析
- 按照前面的猜测: 1=true,启动时加载,0=false,调用时加载。
- 根据输出日志来看,这个猜测是错误的。
<load-on-startup>0</load-on-startup> 优先加载于 <load-on-startup>1</load-on-startup>。
6、ServerOne 和 ServerTwo 位置对调,确定是否和加载顺序有关
<servlet>
<servlet-name>ServerTwo</servlet-name>
<display-name>ServerTwo</display-name>
<servlet-class>com.xx.study.servlet.ServerTwo</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet>
<servlet-name>ServerOne</servlet-name>
<display-name>ServerOne</display-name>
<servlet-class>com.xx.study.servlet.ServerOne</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>ServerTwo</servlet-name>
<url-pattern>/ServerTwo</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>ServerOne</servlet-name>
<url-pattern>/ServerOne</url-pattern>
</servlet-mapping>
7、对调后,日志分析
com.xx.study.servlet.
ServerOne init success.
com.xx.study.servlet.
ServerTwo init success.
结论:和 ServerOne、ServerTwo 位置无关。
四、继续测试 (修改web.xml ,重启 Tomcat,观察Console日志输出)
1、测试1
ServerOne : <load-on-startup>0</load-on-startup> : 正常日志输出
ServerTwo : <load-on-startup>-1</load-on-startup> :无日志输出
2、测试2
ServerOne :不配置该标签: 无日志输出
ServerTwo : <load-on-startup>-11</load-on-startup> :无日志输出
3、测试3
ServerOne : <load-on-startup>10</load-on-startup> :日志输出,在ServerTwo之前
ServerTwo : <load-on-startup>20</load-on-startup> :日志输出,在ServerOne之后
五、结论(总结)
1、load-on-startup 标签作用:用来控制容器启动时,是否加载Servlet。
2、load-on-startup 标签,为负数或不配置时,容器启动时,不加载Servlet。(调用时加载)
3、load-on-startup 标签,为正数,容器启动时,加载Servlet。 且顺序优先级: 0 > 1>2>...n