1. 程式人生 > >Struts2 攔截器 入門

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呼叫ActionsetModel方法將其放入Action內部。

Parameters Interceptor

params

將請求中的引數設定到Action中去。

Prepare Interceptor

prepare

如果Acton實現了Preparable,則該攔截器呼叫Action類的prepare方法。

Scope Interceptor

scope

Action狀態存入sessionapplication的簡單方法。

Servlet Config Interceptor

servletConfig

提供訪問HttpServletRequestHttpServletResponse的方法,以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

呼叫Actionvalidate方法,一旦有錯誤返回,重新定位到INPUT畫面

Parameter Filter Interceptor

N/A

從引數列表中刪除不必要的引數

Profiling Interceptor

profiling

通過引數啟用profile