web.xml中加载顺序为:
Context-param > Listener > Filter > Servlet
下边为所做的测试
一:首先读取的肯定是配置的context-param参数,将其转换为键值,并交给ServletContext
如下配置,可以供spring 的Listener启动时使用
<context-param>
<param-name>contextConfigLocationparam-name>
<param-value>classpath:applicationcontext-*.xmlparam-value>
context-param>
二:Servlet有load-on-startup配置
在servlet的配置当中,
标记容器是否在启动的时候就加载这个servlet。
Num>=0:表示容器在应用启动时就加载这个servlet; 正数的值越小,启动该servlet的优先级越高。
Num < 0:表示容器在该Servlet第一次被访问时才加载。
三:Listener 、Filter、Servlet启动顺序
Context-param > Listener > Filter > Servlet
代码测试如下(部分代码):
编写三个servlet
第一个Servlet : ServletTest1.java
public void init() throws ServletException {
System.out.println("servlet1 执行 init方法,load-on-startup设置为0");
}
第二个Servlet : ServletTest2.java
public void init() throws ServletException {
System.out.println("servlet2 执行 init方法,load-on-startup设置为5");
}
第一个Servlet : ServletTest3.java
public void init() throws ServletException {
System.out.println("servlet3 执行 init方法,load-on-startup设置为-1");
}
一个Listener
ListenerTest.java
public void contextInitialized(ServletContextEvent arg0) {
System.out.println("Listener 执行其初始化contextInitialized方法");
}
一个Filter
FilterTest.java
public void init(FilterConfig arg0) throws ServletException {
System.out.println("Filter 执行init方法");
}
Web.xml文件中配置如下
<servlet>
<servlet-name>ServletTest1servlet-name>
<servlet-class>com.hqb.test.ServletTest1servlet-class>
<load-on-startup>0load-on-startup>
servlet>
<servlet-mapping>
<servlet-name>ServletTest1servlet-name>
<url-pattern>/servlet/ServletTest1url-pattern>
servlet-mapping>
<servlet>
<servlet-name>ServletTest2servlet-name>
<servlet-class>com.hqb.test.ServletTest2servlet-class>
<load-on-startup>5load-on-startup>
servlet>
<servlet-mapping>
<servlet-name>ServletTest2servlet-name>
<url-pattern>/servlet/ServletTest2url-pattern>
servlet-mapping>
<servlet>
<servlet-name>ServletTest3servlet-name>
<servlet-class>com.hqb.test.ServletTest3servlet-class>
<load-on-startup>-1load-on-startup>
servlet>
<servlet-mapping>
<servlet-name>ServletTest3servlet-name>
<url-pattern>/servlet/ServletTest3url-pattern>
servlet-mapping>
<filter>
<filter-name>filterTestfilter-name>
<filter-class>com.hqb.test.FilterTestfilter-class>
filter>
<filter-mapping>
<filter-name>filterTestfilter-name>
<url-pattern>/*url-pattern>
filter-mapping>
<listener>
<listener-class>com.hqb.test.ListenerTestlistener-class>
listener>
启动项目查询运行结果如下:
Listener 执行其初始化contextInitialized方法
Filter 执行init方法
servlet1 执行 init方法,load-on-startup设置为0
servlet2 执行 init方法,load-on-startup设置为5
没有打印ServletTest2.java方法init()中的代码,因为其
<load-on-startup>-1load-on-startup>
设置为-1,只会在第一次访问时才会加载
综上测试,得出我们上边写的加载顺序
Context-param > Listener > Filter > Servlet