一、了解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個方法,
|
其中,init和destroy方法會在程式開始和結束時各執行一遍,不管使用了該攔截器與否,隻要在struts.xml中聲明了該Struts2攔截器就會被執行。
intercept方法就是攔截的主體了,每次攔截器生效時都會執行其中的邏輯。
不過,struts中又提供了幾個抽象類來簡化這一步驟。
|
都是模闆方法實作的。
其中AbstractInterceptor提供了init()和destroy()的空實作,使用時隻需要覆寫intercept()方法;
而MethodFilterInterceptor則提供了includeMethods和excludeMethods兩個屬性,用來過濾執行該過濾器的action的方法。可以通過param來加入或者排除需要過濾的方法。
一般來說,攔截器的寫法都差不多。看下面的示例:
|
四、配置Struts2攔截器
Struts2攔截器需要在struts.xml中聲明,如下struts.xml配置檔案
|
攔截器 | 名字 | 說明 |
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 |