Struts2 攔截器 入門
一、理解Struts2攔截器
1. Struts2攔截器是在訪問某個Action或Action的某個方法,欄位之前或之後實施攔截,並且Struts2攔截器是可插拔的,攔截器是AOP的一種實現.
2. 攔截器棧(Interceptor Stack)。Struts2攔截器棧就是將攔截器按一定的順序聯結成一條鏈。在訪問被攔截的方法或欄位時,Struts2攔截器鏈中的攔截器就會按其之前定義的順序被呼叫。
二、實現Struts2攔截器原理
Struts2攔截器的實現原理相對簡單,當請求struts2的action時,Struts 2會查詢配置檔案,並根據其配置例項化相對的 攔截器物件,然後串成一個列表,最後一個一個地呼叫列表中的攔截器
三、定義Struts2攔截器。
Struts2規定使用者自定義攔截器必須實現com.opensymphony.xwork2.interceptor.Interceptor介面。該介面聲明瞭3個方法,
void init(); |
其中,init和destroy方法會在程式開始和結束時各執行一遍,不管使用了該攔截器與否,只要在struts.xml中聲明瞭該Struts2攔截器就會被執行。
intercept方法就是攔截的主體了,每次攔截器生效時都會執行其中的邏輯。
不過,struts中又提供了幾個抽象類來簡化這一步驟。
public abstract class AbstractInterceptor implements Interceptor; |
都是模板方法實現的。
其中AbstractInterceptor提供了init()和destroy()的空實現,使用時只需要覆蓋intercept()方法;
而MethodFilterInterceptor則提供了includeMethods和excludeMethods兩個屬性,用來過濾執行該過濾器的action的方法。可以通過param來加入或者排除需要過濾的方法。
一般來說,攔截器的寫法都差不多。看下面的示例:
package interceptor; |
四、配置Struts2攔截器
Struts2攔截器需要在struts.xml中宣告,如下struts.xml配置檔案
<?xml version="1.0" encoding="UTF-8"?> <package name="default" extends="struts-default"> |
攔截器 |
名字 |
說明 |
Alias Interceptor |
alias |
在不同請求之間將請求引數在不同名字件轉換,請求內容不變 |
Chaining Interceptor |
chain |
讓前一個Action的屬性可以被後一個Action訪問,現在和chain型別的result()結合使用。 |
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中。 |
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 |