在之前的博客中,介绍了Struts2的内建拦截器和自定义拦截器的一些内容,但是有了这些自带和自定义的拦截器之后,如何去配置和使用,还没有跟大家详细说明,接下来我们就一起学习一下,Struts2中Interceptor的配置和使用。
<span style="font-size:18px;"> <!-- 通过指定拦截器名称和拦截器实现类来定义拦截器 -->
<span style="white-space:pre"> </span><interceptor name="拦截器名" class="拦截器实现类">
</interceptor></span>
如果还需要在配置拦截器的时候传入参数,则需要在<interceptor…/>元素中使用<param…/>子元素进行参数设置,这种方式设置的是拦截器参数的默认参数值。具体格式如下;
<span style="font-size:18px;"><span style="white-space: pre;"> </span><!-- 通过指定拦截器名和拦截器实现类来定义拦截器 -->
<interceptor name="拦截器名" class="拦截器实现类">
<!-- 为拦截器指定参数值 -->
<param name="参数名">参数值</param>
</interceptor></span>
除此之外,还可以把多个拦截器放在一起组成一个“拦截器栈”,比如,如果在Action执行之前想要同时做登录检查、安全性检查以及日志记录等等操作,则可以把这三个操作对应的拦截器组成一个拦截器栈。定义拦截器栈使用<interceptor-stack…/>元素,拦截器栈是由多个拦截器组成的,因此需要在<interceptor-stack…/>元素中使用<interceptor-ref…/>元素来定义多个拦截器的引用,即该拦截器栈由多个<interceptor-ref…/>元素指定的拦截器组成。
如何理解拦截器栈呢?单从结构上来看,拦截器栈是由多个拦截器组成的,但是从功能上来看,拦截器和拦截器栈都是一样的,都是完成对Action的拦截,在Action的execute方法执行之前自动执行,其实,拦截器栈就是一个更大的拦截器而已。拦截器栈的配置信息如下:
<span style="font-size:18px;"><span style="white-space: pre;"> </span><interceptor-stack name="拦截器栈名">
<interceptor-ref name="拦截器一"/>
<interceptor-ref name="拦截器二"/>
<!-- 还可以配置更多的拦截器-->
...
</interceptor-stack></span>
上文我们提到了拦截器栈和拦截器本质上是一种东西,因此拦截器栈里也可以再嵌套或者说是包含拦截器栈,比如下面的配置信息就示例了拦截器栈二引用了拦截器栈一:
<span style="font-size:18px;"><span style="white-space:pre"> </span><interceptor-stack name="拦截器栈1">
<interceptor-ref name="拦截器一"/>
<interceptor-ref name="拦截器二"/>
<!-- 还可以配置更多的拦截器-->
...
</interceptor-stack>
<interceptor-stack name="拦截器栈2">
<interceptor-ref name="拦截器一"/>
<interceptor-ref name="拦截器栈1"/>
<!-- 还可以配置更多的拦截器-->
...
</interceptor-stack></span>
这样做的一个做大好处是软件复用,按照软件需求将拦截器分类,组成不同的拦截器栈,然后在程序开发中根据不同的需求去直接调用响应的拦截器栈即可,这样就不用同时调用那么多的拦截器了,灵活组合即可。
一旦定义了拦截器和拦截器栈之后,就可以使用这个拦截器或者拦截器栈来拦截Action了,拦截器的拦截行为将会在Action的execute方法执行之前执行。通过<interceptor-ref…/>元素可以在Action内使用拦截器,其配置语法和在拦截器栈里面引用拦截器是一样的。如下示例,说明了如何在Action中配置拦截器和拦截器栈。
<span style="font-size:18px;"><span style="white-space: pre;"> </span><!-- 配置本系统所使用的包 -->
<package name="lee" extends="struts-default">
<!-- 应用所需使用的拦截器都在该元素下配置 -->
<interceptors>
<!-- 配置mySimple拦截器 -->
<interceptor name="mySimple"
class="org.ljw.app.interceptor.SimpleInterceptor">
<!-- 为拦截器指定参数值 -->
<param name="name">简单拦截器</param>
</interceptor>
</interceptors>
<action name="login" class="org.ljw.app.action.LoginAction">
<result name="error">/WEB-INF/content/error.jsp</result>
<result>/WEB-INF/content/welcome.jsp</result>
<!-- 配置系统的默认拦截器 -->
<interceptor-ref name="defaultStack"/>
<!-- 应用自定义的mySimple拦截器 -->
<interceptor-ref name="mySimple">
<param name="name">改名后的拦截器</param>
</interceptor-ref>
</action>
<action name="*">
<result>/WEB-INF/content/{1}.jsp</result>
</action>
</package></span>