java Web项目中web.xml中 load-on-startup 标签作用理解

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



猜你喜欢

转载自blog.csdn.net/haha_sir/article/details/79997665
今日推荐