1.通过package包配置后继承:
拦截器配置: <package name="struts-testlogin" extends="struts-default"><interceptors>
<interceptor name="testloginInterceptor" class="test.web.filter.TestLoginItcp" />
<interceptor-stack name="testInterceptor">
<interceptor-ref name="defaultStack" />
<interceptor-ref name="testloginInterceptor" />
</interceptor-stack>
</interceptors>
<!-- 在这里配置默认的拦截器,可以是testloginInterceptor,也可以是testInterceptor
如果是testloginInterceptor则只走testloginInterceptor的拦截
如果是 testInterceptor则按照顺序走defaultStack、testloginInterceptor的拦截-->
<default-interceptor-ref name="testloginInterceptor"></default-interceptor-ref>
</package>
拦截器的使用:
<package name="test" namespace="/Test" extends="struts-testlogin">
<action name="getName" class="test.TestAction">
<result>test.vm</result>
</action>
<action name="getLoginName" class="test.TestAction">
<result>testLogin.vm</result>
<!-- 使用此拦截器 -->
<interceptor-ref name="testloginInterceptor" />
</action>
</package>
在上述的action配置中,getName的action默认的拦截器就是struts-testlogin指定的默认拦截器。
getLoginName配置中,使用的拦截器是指定的testloginInterceptor拦截器。
他们的区别是,getName会按照顺序走defaultStack、testloginInterceptor的拦截,而getLoginName只走testloginInterceptor拦截器。
2.直接在package中配置
<package name="test" namespace="/Test" extends="struts-default">
<interceptors>
<interceptor name="testloginInterceptor" class="test.web.filter.TestLoginItcp" />
<interceptor-stack name="testInterceptor">
<interceptor-ref name="defaultStack" />
<interceptor-ref name="testloginInterceptor" />
</interceptor-stack>
</interceptors>
<action name="getName" class="test.TestAction">
<result>test.vm</result>
</action>
<action name="getLoginName" class="test.TestAction">
<result>testLogin.vm</result>
<!-- 使用此拦截器 -->
<interceptor-ref name="testloginInterceptor" />
</action>
</package>
在上述的action配置中,getName的action是没有指定拦截器,则不进行拦截。
getLoginName指定的拦截器就是testloginInterceptor拦截器。
如果在package中指定默认拦截器则getName的action会使用默认的拦截器,而getLoginName的拦截器不会变。
指定默认拦截器的配置:
<package name="test" namespace="/Test" extends="struts-default">
<interceptors>
<interceptor name="testloginInterceptor" class="test.web.filter.TestLoginItcp" />
<interceptor-stack name="testInterceptor">
<interceptor-ref name="defaultStack" />
<interceptor-ref name="testloginInterceptor" />
</interceptor-stack>
</interceptors>
<!-- 指定默认拦截器 -->
<default-interceptor-ref name="testInterceptor">
<action name="getName" class="test.TestAction">
<result>test.vm</result>
</action>
<action name="getLoginName" class="test.TestAction">
<result>testLogin.vm</result>
<!-- 使用此拦截器 -->
<interceptor-ref name="testloginInterceptor" />
</action>
</package>
3.配置多个拦截器
<package name="test" namespace="/Test" extends="struts-default">
<interceptors>
<interceptor name="testloginInterceptor" class="test.web.filter.TestLoginItcp" />
<interceptor name="checkloginInterceptor" class="test.web.filter.CheckLoginItcp" />
<interceptor-stack name="testInterceptor">
<interceptor-ref name="defaultStack" />
<interceptor-ref name="testloginInterceptor" />
<interceptor-ref name="checkloginInterceptor" />
</interceptor-stack>
</interceptors>
<!-- 指定默认拦截器 -->
<default-interceptor-ref name="testInterceptor">
<action name="getName" class="test.TestAction">
<result>test.vm</result>
</action>
<action name="getLoginName" class="test.TestAction">
<result>testLogin.vm</result>
<!-- 使用此拦截器 -->
<interceptor-ref name="testloginInterceptor" />
</action>
</package>
在上述配置中,默认的拦截器会顺序过defaultStack,testloginInterceptor,checkloginInterceptor三个拦截器的拦截。
4.使用拦截器
拦截器可以在package中制定,也可以在action中制定,指定的方式是:<interceptor-ref name="testloginInterceptor" />
他们的唯一区别是拦截器的工作范围不同,package会影响到其下面的所有action,而action只对本action起作用,不会影响到别的。
当这两者都存在时,以最小粒度的配置为准,即action的配置会覆盖package的配置。