3
<interceptor-ref name="autowiring"/>4
</action>
<interceptor-ref name="autowiring"/>
</action>
使用这种配置,可以被应用到Action上的拦截器没有数量的限制.现在所需要的就是排列拦截器的顺序,它们都将被执行.
第二种方式是为当前的包分配默认的拦截器:
<default-interceptor-ref name="autowiring"/>
这个定义是直属<package ... />标签 的,并且只能有一个拦截器被定义成默认的.
现在已将拦截器配置到了Action映射上了,它将在每个映射的URL请求时被执行.但是这样有一些限制,更多的时候,我们需要将多个拦截器指派给一个Action.事实上,Struts2里基础的功能拦截器有很多,给每个Action指派7,8个拦截器也不是不可能的事.你可以假设一下,为每个Action配置各个拦截器,很快就会变得极难管理.因为这个原因,可使用拦截器栈来管理拦截器.这里有个例子,来自struts-default.xml文件:
<interceptor-stack name="basicStack">
<interceptor-ref name="exception"/>
<interceptor-ref name="servlet-config"/>
<interceptor-ref name="prepare"/>
<interceptor-ref name="checkbox"/>
<interceptor-ref name="params"/>
<interceptor-ref name="conversionError"/>
</interceptor-stack>
这个配置节点在<package ... />节点之下.每个<interceptor-ref … />标签引用一个拦截器或是一个在当前拦截器栈之前定义的拦截器栈.
我们已经看过如何将拦截器应用于Action之上,应用拦截器栈没有什么不同.事实上,我们正是使用相同的标签:
<action name="my" class="com.fdar.infoq.MyAction" >
<result>view.jsp</result>
<interceptor-ref name="basicStack"/>
</action>
这种做法对于默认的拦截器同样有效-简单的使用一个拦截器栈要优于使用单个的拦截器.