Struts2 官方教程:編寫攔截器
阿新 • • 發佈:2019-02-12
攔截器介面
自行編寫的攔截器,必須實現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
記住,invoke會在結果已經被呼叫之後返回(例如在你的JSP已經被渲染之後),讓類似開啟對話方塊之類的事情變得完美。如果你希望在結果被呼叫之前就做點什麼,淫蕩實現一個PreResultListener。
重寫destroy,在應用停止時釋放資源。
執行緒安全
攔截器必須是執行緒安全的!
一個Struts2 動作例項為每個請求都建立,並且不需要是執行緒安全的。相反地,攔截器是在請求之間共享的,因而必須是執行緒安全的。
AbstractInterceptor 抽象攔截器
AbstractInterceptor類提供了一個init和destroy空的實現,並且如果這些方法不被實現,也可以被使用。
對映
通過在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();
}
}