如何配置自己的拦截器
所有的拦截器都是继承【虚拟类】AbstractInterceptor
虚拟类AbstractInterceptor实现接口:Interceptor
所以,自定义拦截器的时候,
第一步需要继承虚拟类AbstractInterceptor
创建拦截器类:
public class Myinterceptor extends AbstractInterceptor {
@Override
public String intercept(ActionInvocation invocation) throws Exception {
System.out.println("做一些前置工作");
//让拦截器向下走,并且返回结果代码:成功或者失败
String invoke = invocation.invoke();
System.out.println("做一些后置工作");
return invoke;
}
}
2.创建好拦截器的类后,还需要在struts2.xml中配置拦截器
第一种类似于局部配置
代码:
<package name="person" extends="struts-default" namespace="/person">
<!--
拦截器的配置
类似于局部配置
-->
<interceptors>
<!--
第一个参数是拦截器的name自己取
第二个参数是拦截器类的全路径
-->
<interceptor name="myinterceptor" class="com.rl.intereptor.Myinterceptor"></interceptor>
</interceptors>
<action name="renliang" class="com.rl.action.PersonAction" method="save">
<!--
配置完成以后,那个类要使用,就必须在那个类中引用一下
name的值是上面拦截器name中的值
-->
<interceptor-ref name="myinterceptor"></interceptor-ref>
<result name="success">/success.jsp</result>
<result name="input">/form.jsp</result>
</action>
</package>
拦截器执行的顺序:
前置拦截器--->Action--->页面(jsp)--->后置拦截器
但是,使用这个方法配置的话,如果有很多个action,需要在每个action中配置一次拦截器,很繁琐
另外一种配置方法:
创建一个package命名为:my-interceptor,继承默认的配置文件struts-default
同时是虚拟包,abstract=true
在这个包中定义拦截器在定义各种拦截器
<package name="my-interceptor" extends="struts-default" abstract="true">
<interceptors>
<interceptor name="myinterceptor" class="com.rl.intereptor.Myinterceptor"></interceptor>
</interceptors>
</package>
然后在下面有action的包在继承刚刚定义的这个包my-interceptor,然后在包中定义默认拦截器,
<default-interceptor-ref name="myinterceptor"></default-interceptor-ref>
同样这个方式也有缺陷,需要用到拦截器栈:
如何定义拦截器栈?
1.创建一个包,继承Struts-default 同样是abstract=true
然后在这个包中自定义自己的拦截器
然后自定义自己的拦截器栈
栈中引用刚刚自己定义的拦截器,同时还需要引用默认的拦截器栈defaultStack
定义好之后,在包中还需要定义一下默认的拦截器栈
ref
代码如下
<package name="my-interceptorSrack" extends="struts-default" abstract="true">
<interceptors>
<!-- 配置自己的拦截器 -->
<interceptor name="myInterceptor" class="com.rl.intereptor.Myinterceptor"></interceptor>
<!-- 配置拦截器栈 -->
<interceptor-stack name="rlStack">
<!-- 拦截器栈中要引用已经配置好的拦截器或者拦截器栈 -->
<interceptor-ref name="myInterceptor"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 把自己配置的rlStack拦截器栈设置成默认的拦截器,只要继承了my-interceptorSrack,就默认执行rlStack中的所有拦截器 -->
<default-interceptor-ref name="rlStack"></default-interceptor-ref>
</package>
之后,只要创建包,只要继承这个包,那么就可以使用自定义的拦截器和默认的拦截器。。。。
<package name="person" extends="my-interceptorSrack" namespace="/person"></package>
2018年5月12日15:42:13。。。。