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):
- 初始化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方法。
注:
在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之context-param,listener,filter,servlet加载顺序及其周边