web.xml中加载顺序为:
Context-param > Listener > Filter > Servlet
下边为所做的测试
一:首先读取的肯定是配置的context-param参数,将其转换为键值,并交给ServletContext
如下配置,可以供spring 的Listener启动时使用
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationcontext-*.xml</param-value>
</context-param>
二:Servlet有load-on-startup配置
在servlet的配置当中,<load-on-startup>num</load-on-startup>的含义是:
标记容器是否在启动的时候就加载这个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>ServletTest1</servlet-name>
<servlet-class>com.hqb.test.ServletTest1</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>ServletTest1</servlet-name>
<url-pattern>/servlet/ServletTest1</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>ServletTest2</servlet-name>
<servlet-class>com.hqb.test.ServletTest2</servlet-class>
<load-on-startup>5</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>ServletTest2</servlet-name>
<url-pattern>/servlet/ServletTest2</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>ServletTest3</servlet-name>
<servlet-class>com.hqb.test.ServletTest3</servlet-class>
<load-on-startup>-1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>ServletTest3</servlet-name>
<url-pattern>/servlet/ServletTest3</url-pattern>
</servlet-mapping>
<filter>
<filter-name>filterTest</filter-name>
<filter-class>com.hqb.test.FilterTest</filter-class>
</filter>
<filter-mapping>
<filter-name>filterTest</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>com.hqb.test.ListenerTest</listener-class>
</listener>
启动项目查询运行结果如下:
Listener 执行其初始化contextInitialized方法
Filter 执行init方法
servlet1 执行 init方法,load-on-startup设置为0
servlet2 执行 init方法,load-on-startup设置为5
没有打印ServletTest2.java方法init()中的代码,因为其
<load-on-startup>-1</load-on-startup>
设置为-1,只会在第一次访问时才会加载
综上测试,得出我们上边写的加载顺序
Context-param > Listener > Filter > Servlet