Servlet、Filter、Listener、Interceptor区别

来源:互联网 发布:jenkins 远程部署 php 编辑:程序博客网 时间:2024/06/05 09:12

1、角色说明

       

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

2、加载顺序

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() 方法的。

3、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接口的实现类)。

4、Listener

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

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

5、Interceptor

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

6、Filter与Interceptor区别

       (1)、拦截器是基于java反射机制的,而过滤器是基于函数回调的。
  (2)、过滤器依赖与servlet容器,而拦截器不依赖与servlet容器。
  (3)、拦截器只能对Action请求起作用,而过滤器则可以对几乎所有请求起作用
  (4)、拦截器可以访问Action上下文、值栈里的对象,而过滤器不能。
  (5)、在Action的生命周期中,拦截器可以多次调用,而过滤器只能在容器初始化时被调用一次。

参考:

1、ServletContext与application的区别 http://blog.csdn.net/xiepeifeng/article/details/6615085

2、http://www.2cto.com/kf/201301/186681.html

3、http://www.cnblogs.com/doit8791/p/4209442.html

4、http://blog.csdn.net/chenleixing/article/details/44573495

5、ApplicationContext与ServletContext的区别 http://blog.sina.com.cn/s/blog_534f69a001011lkj.html

0 0