1. 程式人生 > >Struts2 官方教程:編寫攔截器

Struts2 官方教程:編寫攔截器

攔截器介面

自行編寫的攔截器,必須實現com.opensymphony.xwork2.interceptor.Interceptor 介面。

Interceptor.java

public interface Inteceptor extends Serializable{
    void destroy();
    void init();
    String intercept(ActionInvocation invocation) throws Exception();
}

init方法在攔截器被例項化之後、呼叫intercept之前被呼叫。這是分配任何會被攔截器所使用資源的地方。
intercept

方法是攔截器程式碼被書寫的地方。就像一個動作方法,intercept返回一個被Struts用來轉發請求到另一個網頁資源的結果。使用型別為ActionInvocation的引數呼叫invoke ,會執行這個動作(如果這是棧之中的最後一個攔截器),或者呼叫另一個攔截器。
記住,invoke會在結果已經被呼叫之後返回(例如在你的JSP已經被渲染之後),讓類似開啟對話方塊之類的事情變得完美。如果你希望在結果被呼叫之前就做點什麼,淫蕩實現一個PreResultListener。
重寫destroy,在應用停止時釋放資源。

執行緒安全

攔截器必須是執行緒安全的!

一個Struts2 動作例項為每個請求都建立,並且不需要是執行緒安全的。相反地,攔截器是在請求之間共享的,因而必須是執行緒安全的。

AbstractInterceptor 抽象攔截器

AbstractInterceptor類提供了一個initdestroy空的實現,並且如果這些方法不被實現,也可以被使用。

對映

通過在interceptors元素中巢狀使用interceptor元素來宣告攔截器。下面是來自struts-default.xml。

<struts>
    ···
    <package name="struts-default">
        <interceptors>
            <interceptor name="alias"
class="com.opensymphony.xwork2.interceptor.AliasInterceptor"/>
<interceptor name="autowiring" class="com.opensymphony.xwork2.spring.interceptor.ActionAutowiringInterceptor"/> ··· </struts>

示例

假設現有一個型別為”MyAction”的動作,有一個setDate(Date)方法;這裡簡單的攔截器會設定動作的date為當前時間:

攔截器示例

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

public class SimpleInterceptor extends AbstractInterceptor{
    public String intercept(ActionInvocation invocation) throws Exception{
        MyAction action=(MyAction) invocation.getAction();
        action.setDate(new Date());
        return invocation.invoke();
    }
}