Struts2的攔截器(Interceptor)是非常重要的概念,Struts2中的大多數的功能都是通過攔截器實現的。下面主要講述一下Struts2中攔截器的實現原理,以及嘗試自定義一個攔截器。
1 Struts2中攔截器的原理
在運行Action之前,Struts2會調用一大堆的攔截器,所有的攔截器調用完之後纔會調用用戶自定義的Action。如下圖所示,Struts2在運行過程中,代碼的運行過程如下:
a. 首先運行到StrutsPrepareAndExecuteFilter類,即下圖的Struts2Filter;b. 然後調用Dispatcher的serviceAction()方法;
c. Dispatcher構建ActionProxy對象並調用proxy的execute()方法;
d. ActionProxy在執行execute()方法時調用ActioinInvocation對象的invoke方法;
e. ActioinInvocation對象的invoke()方法會依次取出所有的Interceptor,並執行Interceptor的intercept()方法。(關鍵步驟)
f. Interceptor的intercept()方法在執行的最後會回調ActionInvocation的invoke()方法,這樣纔好繼續執行後面的Interceptor。
g. 當所有的Interceptor執行完成後, ActioinInvocation對象的invoke()會調用我們自定義的Action。
2 自定義Struts2的攔截器
自定義一個攔截器可以參考Struts2的源代碼即可,源碼怎麼定義,我們就怎麼定義。
2.1 定義攔截器
定義攔截器可以繼承AbsactIntercepor抽象類,也可以實現Intercepor接口,這裏我實現Intercepor接口用於計算Action的執行時間,如下:
public class MyInterceptor implements Interceptor {
public void destroy() {
}
public void init() {
}
public String intercept(ActionInvocation invocation) throws Exception {
long start = System.currentTimeMillis();
String r = invocation.invoke();
long end = System.currentTimeMillis();
System.out.println("action time = " + (end - start)); //算出action的執行時間
return r;
}
}
在intercept方法中必須調用invocation.invoke()方法,否則無法執行後面的攔截器和Action。
2.2 部署攔截器
部署攔截器是在struts.xml中進行部署。
首先得聲明攔截器:
<interceptors>
<interceptor name="my" class="cn.edu.MyInterceptor"></interceptor>
</interceptors>
其次需要將攔截器加到action中去:<interceptor-ref name="my"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
默認情況下,Struts2的攔截器是defaultStack,當我們自定義了攔截器加上去後不應該把原有的攔截器覆蓋掉,因此需要協商兩個攔截器(自定義的和defaultStack)。如上面代碼。
其完整的struts.xml如下所示:
<struts>
<constant name="struts.devMode" value="true"></constant>
<package name="test" namespace="/" extends="struts-default">
<interceptors>
<interceptor name="my" class="cn.edu.MyInterceptor"></interceptor>
</interceptors>
<action name="test" class="com.bjsxt.action.TestAction">
<result>/test.jsp</result>
<interceptor-ref name="my"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>
</package>
</struts>
2.3 測試運行
部署到tomcat上後,通過瀏覽器調用test.action,可以看到程序後臺打印出來:
全文完。轉載請註明出處。