Servlet、Filter、Listener、Interceptor區別

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章