现在的位置: 首页 > 综合 > 正文

servlet与filter的加载顺序详解

2013年11月16日 ⁄ 综合 ⁄ 共 1949字 ⁄ 字号 评论关闭

                    项目: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):

初始化tomcat时:
	this is the first filter init().....
	this is the third filter init()....
	this is the second filter init()....
请求/hello时:
	this is the third servlet init()....
	this is the first filter doFilter()....
	this is the second filter doFilter()....
	this is the third filter doFilter()....
	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)

初始化容器时:
	this is the first filter init().....
	this is the third filter init()....
	this is the second filter init()....
	this is the first servlet init()....
	this is the second servlet init()....
	this is the third servlet init()....
请求/hello时:
           this is the first filter doFilter()....
	this is the second filter doFilter()....
	this is the third filter doFilter()....
	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方法。

 

抱歉!评论已关闭.