web.xml中listener, filter, servlet的加载顺序

首先可以肯定的是,加载顺序与它们在 web.xml 文件中的先后顺序无关。



加载顺序为:context-param -> listener -> filter -> servlet。



和顺序有关的是:<servlet-mapping>必须定义在<servlet>之后,<filter-mapping>必须定义在<filter>之后。



另外多个listener被加载的顺序就是它们在web.xml中定义的顺序,这可以解释下面这个经常出现的问题:



log4j:WARN No appenders could be found for logger (org.springframework.web.context.ContextLoader).   
log4j:WARN Please initialize the log4j system properly.   

log4j:WARN No appenders could be found for logger (org.springframework.web.context.ContextLoader).
log4j:WARN Please initialize the log4j system properly.
 

这是因为在配置中把org.springframework.web.context.ContextLoaderListener写在了org.springframework.web.util.Log4jConfigListener之前,这样在加载ContextLoaderListener的时候,系统还没有加载Log4jConfigListener,也就不会去找log4j.properties文件了。只要把Log4jConfigListener的定义放在ContextLoaderListener的定义之前就会解决这个问题。部分代码如下:



<context-param>  
    <param-name>contextConfigLocation</param-name>  
    <param-value>/WEB-INF/applicationContext.xml</param-value>  
</context-param>  
<context-param>  
    <param-name>log4jConfigLocation</param-name>  
    <param-value>/WEB-INF/log4j.properties</param-value>  
</context-param>  
  
<listener>  
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>  
</listener>  
<listener>  
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
</listener> 
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<context-param>
    <param-name>log4jConfigLocation</param-name>
    <param-value>/WEB-INF/log4j.properties</param-value>
</context-param>

<listener>
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

 

你可能感兴趣的:(xml,Web,log4j,servlet)