當接收到一個httprequest ,
a) 當外部的httpservletrequest到來時
b) 初始到了servlet容器 傳遞給一個標準的過濾器鏈
c) FilterDispatecher會去查找相應的ActionMapper,如果找到了相應的ActionMapper它將會將控制權限交給ActionProxy
d) ActionProxy將會通過ConfigurationManager來查找配置struts.xml
i. 下一步將會 通過ActionInvocation來負責命令模式的實現(包括調用一些攔截Interceptor框架在調用action之前)
ii. Interceptor做一些攔截或者初始的工作
e) 一旦action返回,會查找相應的Result
f) Result類型可以是 jsp或者freeMark 等
g) 這些組件和ActionMapper一起返回給請求的url(注意攔截器的執行順序)
h) 響應的返回是通過我們在web.xml中配置的過濾器
i) 如果ActionContextCleanUp是當前使用的,則FilterDispatecher將不會清理sreadlocal ActionContext;如果ActionContextCleanUp不使用,則將會去清理sreadlocals。
1、攔截器是基於java反射機制的,而過濾器是基於函數回調的。
2、過濾器依賴於servlet容器,而攔截器不依賴於servlet容器。
3、攔截器只能對Action請求起作用,而過濾器則可以對幾乎所有請求起作用。
4、攔截器可以訪問Action上下文、值棧裏的對象,而過濾器不能。
5、在Action的生命週期中,攔截器可以多次調用,而過濾器只能在容器初始化時被調用一次。
org.apache.struts2.dispatcher.FilterDispatcher的四個功能
org.apache.struts2.dispatcher.FilterDispatcher是Struts2的主要的Filter,負責四個方面的功能:
(1)執行Actions
(2)清除ActionContext
(3)維護靜態內容
(4)清除request生命週期內的XWork的interceptors
另注:該過濾器應該過濾所有的請求URL。一般被設置爲/*.(過濾所有的請求!)
具體:
(1)執行Actions
過濾器通過ActionMapper對象,來判斷是否應該被映射到Action.如果mapper對象指示他應該被映射,過濾鏈將會被終止,然後Action被調用。這一點非常重要,如果同時使用SiteMesh filter,則SiteMesh filter應該放到該過濾器前,否則Action的輸出將不會被裝飾。
(2)清除ActionContext
過濾器爲了確保內存溢出,會自動的清除ActionContext。這可能會存在一些問題,在和其它的框架集成時,例如SiteMesh。ActionContextCleanUp提供了怎麼處理這些問題的一些信息。
(3)維護靜態內容
過濾器也會維護在Struts2中使用的一些公共的靜態的內容,例如JavaScript文件,CSS文件等。搜索/struts/*範圍內的請求,然後將/struts/後面的值映射到一些struts的公共包中,也可以在你的類路徑中搜索。默認情況下會去查找以下包:org.apache.struts2.static.template。這樣你只用請求/struts/xhtml/styles.css,XHTML UI主題默認的樣式表將會被返回。同樣,AJAX UI組件需要的JavaScript文件,也可以在org.apache.struts2.static包中被找到。如果你想加入其它被搜索的包,在web.xml中設置filter時,通過給"actionPackages"初始參數一個逗號隔開的包列表值來設定。
需注意的是:他會暴露一些比較敏感的信息例如,properites文件中的數據庫連接信息。
注:過濾器支持以下初始參數:
config - 被調入的逗號隔開的XML文件列表。
actionPackages - 被actions掃描的逗號隔開的packages列表。
configProviders - 逗號分隔的實現了ConfigurationProvider接口(建造Configuration時被使用)的實現類。
* - 任意的struts常量。
通過重載createDispatcher()方法,可以自定義dispather。
屬性列表:
(1)actionMapper:通過注入,提供一個ActionMapper實例。
(2)dispatcher:暴露給子類一個Dispatcher實例。
(3)encoding:存儲StrutsConstants.STRUTS_I18N_ENCODING的設置。
(4)filterConfig:通過初始參數,提供一個FilterConfig實例。
(5)lastModifiedCal:在緩存靜態content,提供一個格化的日期用於設定頭信息。
(6)log:提供一個logging實例。
(7)patchPrefixs:存儲靜態資源的路徑前綴信息。
(8)serveStatic:存儲StrutsConstants.STRUTS_SERVE_STATIC_CONTENT的設置。
(9)serveStaticBrowserCache:存儲StrutsConstants.STRUTS_SERVE_STATIC_BROWSER_CACHE的設置。
方法列表:
(1)copy(InputStream input, OutputStream output):從input複製數據到output。
(2)createDispatcher(FilterConfig filterConfig):創建默認的dispatcher對象,如果需要的話,子類可以重載此方法,自定義一個dispatcher對象。
(3)destory():調用dispatcher.cleanup(),依次釋放本地線程,銷燬dispatcher對象。
(4)doFilter(ServletRequest request, ServeltResponse response, FilterChain chain):處理一個action或處理一個請求的靜態內容。
(5)findInputStream(String name, String packagePrefix):搜索類路徑下的靜態資源。
(6)findStaticResoruce(String name, HttpServletRequest request, HttpServletResponse response):搜索靜態的資源,直接複製到相應response的頭信息中。
(7)getContentType(String name):獲取指定資源的contentType。
(8)getFilterConfig():獲取FilterConfig實例。
(9)getServletContext():給WebLogic的一些版本提供一個工作區。
(9)init(FilterConfig filterCongfig):創建默認的dispatcher對象和設置靜態資源的默認包信息來初始化filter。
(10)parse(String packages):返回一個數組通過解析一個指定逗號分隔的packages列表。
(11)prepareDispatcherAndWrapRequest(HttpServletRequest request, HttpServletResponse response):對給定的request對象進行封裝返回一個封裝HttpServletRequest對象。例如顯示的處理multipart數據。
(12)setMapper(ActionMapper actionMapper)
(13)setEncoding(String val)
(14)setServeStaticContent(String val)
(15)setServeStaticBrowserCache(String val)
附:
Struts2(XWork)提供的攔截器的功能說明:
攔截器 |
名字 |
說明 |
Alias Interceptor |
alias |
在不同請求之間將請求參數在不同名字件轉換,請求內容不變 |
Chaining Interceptor |
chain |
讓前一個Action的屬性可以被後一個Action訪問,現在和chain類型的result(<result type=”chain”>)結合使用。 |
Checkbox Interceptor |
checkbox |
添加了checkbox自動處理代碼,將沒有選中的checkbox的內容設定爲false,而html默認情況下不提交沒有選中的checkbox。 |
Cookies Interceptor |
cookies |
使用配置的name,value來是指cookies |
Conversion Error Interceptor |
conversionError |
將錯誤從ActionContext中添加到Action的屬性字段中。 |
Create Session Interceptor |
createSession |
自動的創建HttpSession,用來爲需要使用到HttpSession的攔截器服務。 |
Debugging Interceptor |
debugging |
提供不同的調試用的頁面來展現內部的數據狀況。 |
Execute and Wait Interceptor |
execAndWait |
在後臺執行Action,同時將用戶帶到一箇中間的等待頁面。 |
Exception Interceptor |
exception |
將異常定位到一個畫面 |
File Upload Interceptor |
fileUpload |
提供文件上傳功能 |
I18n Interceptor |
i18n |
記錄用戶選擇的locale |
Logger Interceptor |
logger |
輸出Action的名字 |
Message Store Interceptor |
store |
存儲或者訪問實現ValidationAware接口的Action類出現的消息,錯誤,字段錯誤等。 |
Model Driven Interceptor |
model-driven |
如果一個類實現了ModelDriven,將getModel得到的結果放在Value Stack中。 |
Scoped Model Driven |
scoped-model-driven |
如果一個Action實現了ScopedModelDriven,則這個攔截器會從相應的Scope中取出model調用Action的setModel方法將其放入Action內部。 |
Parameters Interceptor |
params |
將請求中的參數設置到Action中去。 |
Prepare Interceptor |
prepare |
如果Acton實現了Preparable,則該攔截器調用Action類的prepare方法。 |
Scope Interceptor |
scope |
將Action狀態存入session和application的簡單方法。 |
Servlet Config Interceptor |
servletConfig |
提供訪問HttpServletRequest和HttpServletResponse的方法,以Map的方式訪問。 |
Static Parameters Interceptor |
staticParams |
從struts.xml文件中將<action>中的<param>中的內容設置到對應的Action中。 |
Roles Interceptor |