博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
servlet与filter的加载顺序详解
阅读量:4580 次
发布时间:2019-06-09

本文共 2127 字,大约阅读时间需要 7 分钟。

                    项目: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方法。

 

转载于:https://www.cnblogs.com/springmvc3/archive/2011/07/20/2224402.html

你可能感兴趣的文章
phpstudy打不开localhost(Apache)
查看>>
Python实现读取json文件到excel表
查看>>
Opengl_入门学习分享和记录_02_渲染管线(一)顶点着色器&片段着色器
查看>>
[USACO07DEC]Sightseeing Cows
查看>>
什么是网站CDN服务,CDN加速原理?
查看>>
内存泄漏以及常见的解决方法
查看>>
解决itunesconnect无法訪问
查看>>
Java使用OkHttps工具类调用外部接口
查看>>
Linux VIM python 自动补全插件:pydiction
查看>>
爬楼梯
查看>>
【18】AngularJS 包含
查看>>
spring 事务
查看>>
生产者和消费者
查看>>
专题-HTTP
查看>>
洛谷 P3366 【模板】最小生成树
查看>>
VUEX报 “was assigned to but it has no setter”
查看>>
ios 不支持-,-时间。
查看>>
AntDesign vue学习笔记(二)axios使用
查看>>
关于Altera LVDS 经验分享
查看>>
英语学习
查看>>