Struts2中Interceptor攔截器的使用

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,可以看到程序後臺打印出來:



全文完。轉載請註明出處。



發佈了52 篇原創文章 · 獲贊 17 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章