servlet与filter的加载顺序详解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了servlet与filter的加载顺序详解相关的知识,希望对你有一定的参考价值。

          项目:3个filter,3个servlet,匹配的url路径/hello。

 

情况1:servlet没加<load-on-startup></load-on-startup>情况(web.xml配置顺序:first filter,second filter,third filter,first servlet,second servlet,third servlet):

[html] view plain copy
 
  1. 初始化tomcat时:  
  2.     this is the first filter init().....  
  3.     this is the third filter init()....  
  4.     this is the second filter init()....  
  5. 请求/hello时:  
  6.     this is the third servlet init()....  
  7.     this is the first filter doFilter()....  
  8.     this is the second filter doFilter()....  
  9.     this is the third filter doFilter()....  
  10.     this is the third servlet doPost()....  

 

结论:初始化只执行filter的init()方法,不执行servlet的init()的方法。请求/hello时,执行最后一个servlet的init()方法,再按顺序执行filter。最后执行最后一个servlet的方法。
filter执行循序看<filter-mapping>的。servlet执行顺序看<servlet-mapping>的。

 

情况2:servlet加了<load-on-startup></load-on-startup>的情况(配置顺序同1)

[html] view plain copy
 
  1. 初始化容器时:  
  2.     this is the first filter init().....  
  3.     this is the third filter init()....  
  4.     this is the second filter init()....  
  5.     this is the first servlet init()....  
  6.     this is the second servlet init()....  
  7.     this is the third servlet init()....  
  8. 请求/hello时:  
  9.            this is the first filter doFilter()....  
  10.     this is the second filter doFilter()....  
  11.     this is the third filter doFilter()....  
  12.     this is the third servlet doPost()....  

 

结论:容器初始化时,先初始化所有filter的init()方法。再初始化所有servlet的init()方法。且servlet的init()方法根据load-on-startup值决定执行顺序,值越小,越先执行。在请求/hello时,不再执行init()方法。执行循序同1.

=======================================================================================================

总结:


1).filter的init方法在容器初始化时加载。第一次加载容器执行顺序随机,以后再次加载顺序以第一次加载顺序为准。
2).filter的doFilter方法在请求url时执行,如果有多个filter匹配,则按照<filter-mapping>顺序执行(前提是doFilter方法里面最后要调用FilterChain的doFilter方法,这个方法作用是继续执行下个filter,如果没有加,则不执行下面的filter)

 

3).serlvet的init方法
a.如果web.xml中配置了<load-on-startup>属性,则在Tomcat初始化时按其值从小到大的顺序加载所有servlet的init方法。
b.如果没有配置<load-on-startup>属性,容器初始化时不加载。在请求匹配的url时进行加载,并且只加载最后一个servlet的init方法。其他的servlet不加载。
4).servlet的doGet、doPost方法:在请求匹配的url路径时加载,而且只加载最后一个servlet的方法,其他方法不加载。 

5).filter和servlet同时存在,且容器初始化都要加载,则先加载filter再加载servlet的init方法。

6).如果请求的url既匹配filter又匹配servlet,并且servlet的init方法没有在容器初始化加载,则先加载匹配的servlet的最后一个servlet的init方法,再按顺序执行filter方法,最后再执行匹配的最后一个servlet方法。

 

注:

在servlet的配置当中,<load-on-startup>5</load-on-startup>的含义是:

标记容器是否在启动的时候就加载这个servlet。

当值为0或者大于0时,表示容器在应用启动时就加载这个servlet;

当是一个负数时或者没有指定时,则指示容器在该servlet被选择时才加载。

正数的值越小,启动该servlet的优先级越高。

 

1)load-on-startup元素标记容器是否在启动的时候就加载这个servlet(实例化并调用其init()方法)。

2)它的值必须是一个整数,表示servlet应该被载入的顺序

2)当值为0或者大于0时,表示容器在应用启动时就加载并初始化这个servlet;

3)当值小于0或者没有指定时,则表示容器在该servlet被选择时才会去加载。

4)正数的值越小,该servlet的优先级越高,应用启动时就越先加载。

5)当值相同时,容器就会自己选择顺序来加载。

 







以上是关于servlet与filter的加载顺序详解的主要内容,如果未能解决你的问题,请参考以下文章

web.xml加载顺序详解

WEB容器启动——web.xml加载详解

web.xml之context-param,listener,filter,servlet加载顺序及其周边

(转)web.xml 中的listener filterservlet 加载顺序及其详解

web.xml详解

web.xml