通常,同一组拦截器可能适用于不同的动作类,例如,
<package name="default" namespace="/" extends="struts-default">
<action name="checkInAction"
class="com.mkyong.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.mkyong.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.mkyong.common.action.CheckInAction" >
<interceptor-ref name="defaultStackWithLog"/>
<result name="success">pages/checkIn.jsp</result>
</action>
<action name="checkOutAction"
class="com.mkyong.common.action.CheckOutAction" >
<interceptor-ref name="defaultStackWithLog"/>
<result name="success">pages/checkOut.jsp</result>
</action>
</package>
在以上更新的示例中,声明了一个名为“ defaultStackWithLog ”的拦截器堆栈,其中包括“ timer ”,“ logger ”和“ defaultStack ”拦截器,并通过“ interceptor-ref ”元素将其引用为普通拦截器 。
参考
翻译自: https://mkyong.com/struts2/struts-2-interceptor-stack-example/