servlet 和filter區別和servlet、filter、interceptor的執行順序

1)servlet和filter的區別
Filter可認爲是Servlet的一種“變種”,它主要用於對用戶請求進行預處理,也可以對HttpServletResponse進行後處理,是個典型的處理鏈。它與Servlet的區別在於:它不能直接向用戶生成響應。完整的流程是:Filter對用戶請求進行預處理,接着將請求交給Servlet進行處理並生成響應,最後Filter再對服務器響應進行後處理。

2)servlet、filter、interceptor的執行順序

通過上圖可以看到,順序應該是我們配的filter在前,之後是struts2的FilterDispatcher,然後是各個攔截器,最後原路返回。
cwx714 (架構師) 2010-05-10


filter與servlet:
http://www.cnblogs.com/Fskjb/archive/2010/03/27/1698448.html

filter 與 struts 攔截器
http://bruceyoo.iteye.com/blog/631355
http://jwx0925.iteye.com/blog/631968

Struts2中攔截器與過濾器的執行順序證明:
http://blog.163.com/mail_sv/blog/static/13853926420102295392416/

==============
略多細讀
Anddy (架構師) 2010-05-11
引用
servlet和filter有什麼區別


看Servelt規範:
引用
A filter is a reusable piece of code that can transform the content of HTTP requests, responses, and header information. Filters do not generally create a response or respond to a request as servlets do, rather they modify or adapt the requests for a resource, and modify or adapt responses from a resource.


簡要翻譯下:
filter是一個可以複用的代碼片段,可以用來轉換HTTP請求、響應和頭信息。Filter不像Servlet,它不能產生一個請求或者響應,它只是修改對某一資源的請求,或者修改從某一的響應。

再在看Filter的繼承體系(不繼承Servlet接口):

Java代碼 收藏代碼
  1. public interface Filter


所以第一個結論:Servlet和Filter沒有關係!但是2者可以很好的協同工作。


引用

servlet、filter、interceptor


首先,關於Interceptor。Interceptor是XWork中引入的概念,Struts2的核心是XWork2。Struts2的DispatcherFilter從SerlvetContainer中,獲取到HTTP請求,然後交由內部的Interceptor處理。

Interceptor不是Servlet JSR中的概念。所以Interceptor與其他Filter的執行順序,取決於Struts2的DispatcherFilter與其他Filter的執行順序。


問題變爲: Servlet Filter Struts2的DispatcherFilter的執行順序。

在Servlet JSR中說明了Servlet和Filter執行的順序:

如果一個請求匹配了一個Serlvet,並且該Servlet配置了一個或者多個Filter,毫無疑問,先執行Filter,再執行Servlet。

對與多個匹配的Filter,哪個先執行呢?

JSR中說明的是,按照多個匹配的Filter,是按照其在web.xml中配置的順序來執行的。

所以這也就是,把自己的Filter或者其他的Filter(比如UrlRewrite的Filter)放在Struts的DispatcherFilter的前面的原因。因爲,它們需要在請求被Struts2框架處理之前,做一些前置的工作。

當Filter被調用,並且進入了Struts2的DispatcherFilter中後,Struts2會按照在Action中配置的Interceptor Stack中的Interceptor的順序,來調用Interceptor。


xiaolongfeixiang (資深架構師) 2010-05-11
其實你可以把 Interceptor理解爲 Struts的Filter調用的方法。這樣你就清楚了。

這個流程和以前的 Filter-> Servlet 一樣的。
xiaolongfeixiang (資深架構師) 2010-05-11


引用
org.apache.struts.action.ActionServlet


這個是struts 中最核心的servlet,所有的請求都是通過它。
Anddy (架構師) 2010-05-11
看看這張圖,再看看這篇文章,應該明白了servlet跟action之間的關係。action只是處理業務邏輯,並不是servlet。ActionServlet纔是struts中控制器,在底層負責所有的轉發,分配處理等。



http://cheng5259.iteye.com/blog/638716
Anddy (架構師) 2010-05-11
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章