servlet、listener、filter、Interceptor

概念上:

 servlet:是運行於服務端的java程序,可生成動態的web頁面。接受請求、產生響應頁面和數據。

filter:用於對請求或者相應進行預處理和後處理。它與Servlet的區別在於:它不能直接向用戶生成響應。使用方式:實現了Filter接口的類,web.xml中配置。

listener:監聽,比如監聽web服務器中的某次執行動作,並作出響應。在application,session,request三個對象創建消亡或者往其中添加修改刪除屬性時自動執行代碼的功能組件。比如Spring的總監聽器,服務啓動時加載bean,主要作用是: 做一些初始化的內容添加工作、設置一些基本的內容、比如一些參數或者是一些固定的對象等等。


interceptor:攔截器,面向切面的(難道在struts中也是用的AOP實現的麼?)


servlet、filter、listener是配置到web.xml中(web.xml 的加載順序是:context-param -> listener -> filter -> servlet ),interceptor不配置到web.xml中,struts的攔截器配置到struts.xml中。spring的攔截器配置到spring.xml中。 


一些區別:


  1. filter 流程是線性的, url傳來之後,檢查之後,可保持原來的流程繼續向下執行,被下一個filter, servlet接收等,而servlet 處理之後,不會繼續向下傳遞。
  2. servlet、filter是針對url的,而listener是針對對象的(比如爲struts的action注入屬性)。
  3. interceptor功能上類似filter,但是不是基於url的,是基於action的,當頁面提交action時,進行過濾操作。

與filter不同點:(1)不在web.xml中配置,而是在struts.xml中完成配置,與action在一起
                            ( 2  ) 可由action自己指定用哪個interceptor 來在接收之前做事
   


 

 另外,

struts2中的過濾器和攔截器的區別與聯繫:

 

      (1)、攔截器是基於java反射機制的,而過濾器是基於函數回調的。
      (2)、過濾器依賴與servlet容器,而攔截器不依賴與servlet容器。
      (3)、攔截器只能對Action請求起作用,而過濾器則可以對幾乎所有請求起作用。
      (4)、攔截器可以訪問Action上下文、值棧裏的對象,而過濾器不能。
      (5)、在Action的生命週期中,攔截器可以多次調用,而過濾器只能在容器初始化時被調用一次。

補充說明:(1)攔截器基於java反射,通過xml配置時,通過類名加載bean。還有一說,攔截器基於動態代理,那麼動態代理也可以理解爲基於反射。

                   過濾器基於函數回調:過濾器調用有一個filterChain,看這裏http://www.cnblogs.com/LBSer/p/4853234.html的評論區,說的很好。就是說,基於接口的方法調用,其實就是java裏面的回調。

                  (2)


這裏有一份springMVC裏面的攔截器和filter的區別:

就是說,filter是在servlet規範中的,被限定在servlet的前後起作用,而攔截器,在spring中是一個spring組件,因此可以使用spring裏面的任何資源和對象。從這裏我們也可以類比struts中的攔截器一些相似的特性。比如類似上面的第4點特性。


對第3點的疑問,除了acton類型,還有哪些其他類型請求?

 

對第5點,完全不懂。

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