天天看點

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();
void destroy();
String intercept(ActionInvocation invocation) throws Exception;
      

其中,init和destroy方法會在程式開始和結束時各執行一遍,不管使用了該攔截器與否,隻要在struts.xml中聲明了該Struts2攔截器就會被執行。

intercept方法就是攔截的主體了,每次攔截器生效時都會執行其中的邏輯。

不過,struts中又提供了幾個抽象類來簡化這一步驟。

public abstract class AbstractInterceptor implements Interceptor;
public abstract class MethodFilterInterceptor extends AbstractInterceptor;
      

都是模闆方法實作的。

其中AbstractInterceptor提供了init()和destroy()的空實作,使用時隻需要覆寫intercept()方法;

而MethodFilterInterceptor則提供了includeMethods和excludeMethods兩個屬性,用來過濾執行該過濾器的action的方法。可以通過param來加入或者排除需要過濾的方法。

一般來說,攔截器的寫法都差不多。看下面的示例:

package interceptor;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
public class MyInterceptor implements Interceptor {
public void destroy() {
// TODO Auto-generated method stub
}
public void init() {
// TODO Auto-generated method stub
}
public String intercept(ActionInvocation invocation) throws Exception {
System.out.println("Action執行前插入 代碼");      
//執行目标方法 (調用下一個攔截器, 或執行Action)    
final String res = invocation.invoke();    
System.out.println("Action執行後插入 代碼");    
return res;    
}
}      

四、配置Struts2攔截器

Struts2攔截器需要在struts.xml中聲明,如下struts.xml配置檔案

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.objectFactory" value="spring" />
 


<package name="default" extends="struts-default">
<interceptors>
<interceptor name="MyInterceptor" class="interceptor.MyInterceptor"></interceptor>
<interceptor-stack name="myInterceptorStack">
<interceptor-ref name="MyInterceptor"/>
<interceptor-ref name="defaultStack"/>
</interceptor-stack>
</interceptors>
<action name="loginAction" class="loginAction">
<result name="fail">/index.jsp </result>
<result name="success">/success.jsp</result>
<interceptor-ref name="myInterceptorStack"></interceptor-ref>
</action>
</package>
</struts>
      
攔截器 名字 說明
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