servlet与filter的加载顺序详解

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

  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)

  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方法。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值