Struts2攔截器棧的例子


很多時候,相同的一組攔截器可以適用於不同的動作類,例如,
<package name="default" namespace="/" extends="struts-default">
	
    <action name="checkInAction" 
	class="com.tw511.common.action.CheckInAction" >
	<interceptor-ref name="timer"/>
        <interceptor-ref name="logger"/>
	<interceptor-ref name="defaultStack" />
	<result name="success">/pages/checkIn.jsp</result>
    </action>
	
    <action name="checkOutAction" 
	class="com.tw511.common.action.CheckOutAction" >
	<interceptor-ref name="timer"/>
        <interceptor-ref name="logger"/>
	<interceptor-ref name="defaultStack" />
	<result name="success">/pages/checkOut.jsp</result>
    </action>
		
</package>
在上述情況下,它有許多重複工作以及不能重複使用。

幸運的是,在Struts 2自帶的攔截器棧,使開發人員建立一組攔截到一個單元名為「棧名字」, 和可以通過「棧名字」參照操作它。

最佳做法
建議組合相同的一組攔截器到一個攔截器棧擺脫重複的工作,並增加了專案的可重用性。
<package name="default" namespace="/" extends="struts-default">
	
     <interceptors>
       	<interceptor-stack name="defaultStackWithLog">
             <interceptor-ref name="timer"/>
             <interceptor-ref name="logger"/>
	     <interceptor-ref name="defaultStack" />
        </interceptor-stack>
    </interceptors>
		
    <action name="checkInAction" 
	class="com.tw511.common.action.CheckInAction" >
	<interceptor-ref name="defaultStackWithLog"/>
	<result name="success">/pages/checkIn.jsp</result>
    </action>
	
    <action name="checkOutAction" 
	class="com.tw511.common.action.CheckOutAction" >
	<interceptor-ref name="defaultStackWithLog"/>
	<result name="success">/pages/checkOut.jsp</result>
    </action>
		
</package> 

在上面的例子更新,宣告一個攔截器棧,命名為「defaultStackWithLog」其中包括「timer「, 「logger」 和 「defaultStack」 攔截器,並且它通過「interceptor-ref」元素參照一個正常的攔截器。

參考

  1. Struts2攔截器文件