一、创建顺序
1、web.xml文件中的加载顺序为:listener-filter-servlet
2、如果web.xml中配置了<context-param>,初始化顺序:
context-param > Listener > Filter > Servlet
二、三大Web组件的生命周期
1、Listener:
Listener生命周期:一直从程序启动到程序停止运行。
1.ServletContextListener:程序启动调用Listener的contextInitialized()方法,程序停止调用Listener的contextDestroyed()方法
2.ServletRequestListener:每次访问一个Request资源前,都会执行requestInitialized()方法,方法访问完毕,都会执行requestDestroyed()方法。
3.HttpSessionListener:每次调用request.getSession(),都会执行sessionCreated()方法,执行session.invalidate()方法,都会执行sessionDestroyed()方法。
4.ServletRequestAttributeListener:每次调用request.setAttribute()都会执行attributeAdded()方法,
如果set的key在request里面存在,就会执行attributeReplacerd()方法,
调用request.removeAttribute()方法,都会执行attributeRemoved()方法。
2、Filter
程序启动调用Filter的init()方法(永远只调用一次),程序停止调用Filter的destroy()方法(永远只调用一次),
doFilter()方法每次的访问请求如果符合拦截条件都会调用
程序第一次运行,会在servlet调用init()方法以后调用,不管第几次调用,都在调用doGet(),doPost()方法之前。
3、Servlet
程序第一次访问,会调用servlet的init()方法初始化(只执行一次),每次程序执行都会根据请求调用doGet()或者doPost()方法,程序停止调用destory()方法。
三、关于多个Filter时如何执行
一、当我们为一个资源设置了多个过滤器时,这些过滤器就组成一个Filter链的结构。
当执行到一个filter的doFilter方法,调用其中的chain.doFilter()。如果还有拦截器(filter),则继续执行下一个filter的doFIlter方法,
如果之后没有过滤器了,就放行请求。相当于调用了目标资源的service()方法。
doFilter()方法用于调用Filter链上的下一个过滤器,如果当前过滤器为最后一个过滤器则将请求发送到目标资源。
二、当有多个Filter时,在web.xml中<url-pattern>靠前的filter先执行