Servlet、Filter、Listener、Interceptor

首先,JSP/Servlet规范中定义了Servlet、Filter、Listener这三种角色,并无定义Interceptor这个角色,Interceptor是某些MVC框架中的角色,好比Struts2中,Interceptor是用来拦截Action中的方法的调用,在被拦截的Action方法被执行前,先执行响应的拦截器中的方法。
servlet、filter、listener是配置到web.xml中,interceptor不配置到web.xml中,struts的拦截器配置到struts.xml中。spring的拦截器配置到spring.xml中。


servlet、filter、listener三者的加载顺序与它们在 web.xml 文件中配置的前后顺序无关。即不会由于filter写在listener的前面而会先加载filter:加载它们的前后顺序是:listener -> filter -> servlet
同时还存在着这样一种配置节:context-param,它用于向 ServletContext 提供键值对,即应用程序上下文信息。咱们的 listener, filter 等在初始化时会用到这些上下文中的信息,那么 context-param 配置节是否是应该写在 listener 配置节前呢?实际上 context-param 配置节可写在任意位置,所以真正的加载顺序为:context-param -> listener -> filter -> servlet


context-param、listener、 filter、 servlet的加载顺序不是配置时前后顺序的影响,可是多个filter时,filter之间的加载顺是受影响的。web 容器启动时初始化每一个 filter 时,是按照 filter 配置节出现的顺序来初始化的,当请求资源匹配多个 filter-mapping 时,filter 拦截资源是按照 filter-mapping 配置节出现的顺序来依次调用 doFilter() 方法的。


==================================Filter=============================================
filter过滤器是在Java Servlet规范2.3中定义的,在Java Servlet规范2.3出来以前,是没有filter这个角色的。
filter这个角色是用来:在请求到达servlet以前,先截获请求,对请求先作一些预处理(例如编码转换,权限验证)。处理完后在把请求转发给servlet或把不符合某些规则的请求丢弃掉,再也不转发给servlet了。当servlet处理好请求后,返回响应给浏览器时,filter拦截响应,对响应作一些处理以后,再返回给浏览器。因而可知,filter这个角色的职责就是:帮servlet作一些前期预处理工做(先于servlet处理request)和蔼后工做(后于servlet处理response)的辅助角色,它就像servlet的助手同样,但它并非必须的,由于在以前没有filter的时候,servlet也能很好地工做。只是若是有filter的帮助的话,servlet就能更专一处理一些核心的业务。
多个filter能够协同工做,它们之间采用了职责链的设计模式来协同工做。一个filter处理完后,调用下一个filter来处理,每一个filter负责处理不一样的工做,而这些filter之间能够根据须要灵活组合。filter的前后顺序按filter在web.xml中配置的前后顺序。
filter须要servlet容器(tomcat)的支持,能运行filter的servlet容器必须实如今Java Servlet规范2.3版中定义的功能。servlet容器是对javax.servlet.Filter这个接口进行编程的,因此你本身写的filter必须直接或间接的实现了javax.servlet.Filter这个接口,不然servlet容器不能跟你定义的filter进行交互(由于在编程实现容器时,就把javax.servlet.Filter这个接口编进容器代码中了,容器只能调用javax.servlet.Filter接口的实现类)。




=====================================Listener============================================
listener是对事件进行监听和处理的角色,它采用观察者模式,只有当在这个listener上注册了的事件
发生时,listener才会执行事件处理方法。这些事件举例:上下文(context)加载事件;session建立或销毁事件;容器、session或请求的属性设置或移除事件等。


servlet2.4规范中提供了8个listener接口,能够将其分为三类,分别以下:
第一类:与servletContext(Application)有关的listner接口。包括:ServletContextListener、ServletContextAttributeListener
第二类:与HttpSession有关的Listner接口。包括:HttpSessionListner、HttpSessionAttributeListener、HttpSessionBindingListener、                                                     HttpSessionActivationListener;
第三类:与ServletRequest有关的Listener接口,包括:ServletRequestListner、ServletRequestAttributeListener




=====================================Interceptor=========================================
Interceptor是某些MVC框架中的角色,好比Struts2中,Interceptor是用来拦截Action中的方法的调用,在被拦截的Action方法被执行前,先执行响应的拦截器中的方法。interceptor:是在面向切面编程的,就是在你的service或者一个方法,前调用一个方法,或者在方法后调用一个方法,好比动态代理就是拦截器的简单实现。filter是在servlet前面拦截请求,而interceptor是利用面向切面编程的技术,在Struts的内部Action中拦截调用方法请求。java

相关文章
相关标签/搜索