3.2.2 攔截器介紹
攔截器可以實現橫切(crosscutting)功能并使這些實現相對action甚至Struts 2框架保持獨立。這樣可以使核心框架代碼比以前更加簡潔,且使開發人員更快捷地使用新框架的特性。實際上,松耦合機制意味著用戶再也不用等著框架來實現他們所需的新特性;相反,它們可以實現和使用自己所需的特性且不用修改框架的底層源代碼。
使用攔截器可以達到如下所描述的目的。
在調用action之前,提供預處理(preprocessing)邏輯。
與action進行交互,提供執行信息,比如受Spring管理的對象、設置action里的請求參數等。
在調用action之后,提供后處理(postprocessing)邏輯。
修改返回的結果,進而修改呈現給用戶的內容。
捕獲異常從而替換可執行的處理過程或返回一個不同結果。
很多Struts 2特性都是通過攔截器提供的。表3-1列出了Struts 2中已配置好且可隨時使用的攔截器。
表3-1 Struts 2框架提供的攔截器
攔 截 器 |
配 置 名 |
描 述 |
別名攔截器(Alias Interceptor) |
alias |
允許參數在跨越多個請求時使用不同別名,這個攔截器可將多個action使用不同名字鏈接起來,然后用于處理同一信息 |
鏈攔截器(Chaining Interceptor) |
chaining |
允許當前action能夠使用上一個被執行action的屬性,這個攔截器通常要和“chain”結果類型一起使用 |
多選框攔截器(Checkbox Interceptor) |
checkbox |
為沒有被選定的多選框增加一個值為false的參數,協助管理多選框(在HTTP請求里,那些沒有被選定的多選框通常是沒有任何信息的) |
轉換錯誤攔截器(Conversion Error Interceptor) |
conversionError |
將轉換錯誤的信息(包括轉換的字符串和參數類型等)存放到action的字段錯誤集里去 |
會話創建攔截器(Create Session Interceptor) |
createSession |
自動創建一個HTTP會話(如果不存在會話) |
調試攔截器(Debugging Interceptor) |
debugging |
為開發者提供幾種不同調試界面 |
執行和等待攔截器(Execute and Wait Interceptor) |
execAndWait |
當action在后臺執行時,給用戶顯示一個過渡性的等待頁面 |
異常攔截器(Exception Interceptor) |
exception |
將action拋出的異常映射到結果,這樣就通過重定向來自動處理異常 |
文件上傳攔截器(File Upload Interceptor) |
fileUpload |
便于文件上傳 |
國際化攔截器(Internatio- nalization Interceptor) |
i18n |
在用戶會話中跟蹤選定的區域(locale)信息 |
日志攔截器(Logging Interceptor) |
logger |
通過輸出被執行action的名字,提供簡單的日志功能 |
消息存儲攔截器(Message Store Interceptor) |
store |
在會話中為action存儲和檢索消息、字段錯誤以及action錯誤,該攔截器要求action實現ValidationAware接口 |
模型驅動攔截器(Model Driven Interceptor) |
modelDriven |
將action的模型對象存放在棧里,該攔截器要求action實現ModelDriven接口 |
作用域模型驅動攔截器(Scoped Model Driven Interceptor) |
scopedModelDriven |
在aciton的配置作用域里存儲和檢索模型對象,該攔截器要求action實現ScopedModelDriven接口 |
參數攔截器(Parameters Interceptor) |
params |
在action里設置請求參數 |
參數過濾攔截器(Parameter Filter Interceptor) |
n/a |
控制action對參數的訪問(非默認配置) |
(續)
攔 截 器 |
配 置 名 |
描 述 |
預備攔截器(Prepare Interceptor) |
prepare |
調用action的prepare()方法,該攔截器要求action實現Preparable接口 |
概要攔截器(Profiling Interceptor) |
profile |
允許action記錄簡單的概要信息日志 |
作用域攔截器(Scope Interceptor) |
scope |
在會話和應用作用域中存儲和檢索action的狀態 |
Servlet配置攔截器(Servlet Configuration Interceptor) |
servletConfig |
使action能訪問servlet里的各種信息 |
靜態參數攔截器(Static Parameters Interceptor) |
staticParams |
設置action里的靜態定義值(通過action配置里的param標簽來實現) |
角色攔截器(Roles Interceptor) |
roles |
只有在用戶是配置的角色之一時才允許執行action |
計時攔截器(Timer Interceptor) |
timer |
以執行action所花時間的形式,簡單記錄action概要信息 |
令牌攔截器(Token Interceptor) |
token |
檢查action的合法令牌,以防止重復提交表單 |
令牌會話攔截器(Token Session Interceptor) |
tokenSession |
功能與令牌攔截器相同,但是對于非法令牌,提交的數據將保存在會話中 |
驗證攔截器(Validation Interceptor) |
validation |
為action提供驗證支持 |
工作流攔截器(Workflow Interceptor) |
workflow |
當驗證失敗時,不執行action然后重定向到INPUT視圖 |
每個攔截器為action提供的特性都不一樣。你可能已經猜到了,為action提供一個完備的執行環境需使用多個攔截器。為了便于使用,Struts 2允許創建攔截器棧(interceptor stack),由action來引用,而不是為每個action逐個配置所有攔截器。表3-2列出了所有Struts 2框架預配置好的棧,每個棧中包含多個攔截器。有一個很重要的問題必須注意,那就是攔截器是按照配置好的順序來調用的。
表3-2 Struts 2框架提供的攔截器棧
已配置棧名 |
包含的攔截器 |
描 述 |
basicStack |
exception、servletConfig、prepare、checkbox、params、conversionError |
如使用棧,最起碼要使用這幾個攔截器 |
validationWorkflowStack |
basicStack、validation、workflow |
在基本棧的基礎上增加驗證和工作流特性 |
fileUploadStack |
fileUpload、basicStack |
在基本棧的基礎上增加文件上傳特性 |
modelDrivenStack |
modelDriven、basicStack |
在基本棧的基礎上增加模型功能特性 |
chainStack |
chain、basicStack |
在基本棧的基礎上增加鏈接特性 |
i18nStack |
i18n、basicStack |
在基本棧的基礎上增加區域持久化特性 |
(續)
已配置棧名 |
包含的攔截器 |
描 述 |
paramPrepareParamsStack |
exception、alias、params、servletConfig、prepare、i18n、chain、modelDriven、file- Upload、checkbox、staticParams、params、conversionError、vali- dation、workflow |
提供包括前action(pre-action)方法調用的完整棧。params棧使用兩次:第一次是在調用prepare()方法之前提供參數,第二次是在預備階段為可能被檢索的對象重新使用參數 |
defaultStack |
exception、alias、servlet- Config、prepare、i18n、chain、debugging、profiling、scoped- ModelDriven、modelDriven、fileUpload、checkbox、static- Params、params、conversion- Error、validation、workflow |
提供一個完整棧,包括調試和概要 |
executeAndWaitStack |
execAndWait、defaultStack、execAndWait |
提供執行與等待棧,比如在上傳文件時需要向用戶顯示一個等待頁面時,就可以使用這個棧 |
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 |
roles |
確定用戶是否具有JAAS指定的Role,否則不予執行。 |
Timer Interceptor |
timer |
輸出Action執行的時間 |
Token Interceptor |
token |
通過Token來避免雙擊 |
Token Session Interceptor |
tokenSession |
和Token Interceptor一樣,不過雙擊的時候把請求的數據存儲在Session中 |
Validation Interceptor |
validation |
使用action-validation.xml文件中定義的內容校驗提交的數據。 |
Workflow Interceptor |
workflow |
調用Action的validate方法,一旦有錯誤返回,重新定位到INPUT畫面 |
Parameter Filter Interceptor |
N/A |
從參數列表中刪除不必要的參數 |
Profiling Interceptor |
profiling |
通過參數激活profile |