Struts2 的拦截器
拦截器 :可以在Action,resul被执行之前或之后进行一系列的处理。比如当我们在淘宝买东西时,如果你刚开始没有登录,点击添加购物车或购买会跳转到登录界面。
Part One
拦截器的使用方法 。
1.定义一个 类 (如本文中的MyIntercepter )使其实现Intercepter的接口。重写它的抽象方法。
在intercept()方法中,你可以编写自己将要完成的功能代码。
2.在struts.xml配置拦截器:
<interceptors>
<interceptor name="拦截器的名字" class="拦截器对应的JAVA类型"/>
</interceptors>
3.在Action的配置中,使用拦截器<interceptor-ref name=”拦截器的名字”>。
简单的Interceptor例子:
package com.inter;
//注意interceptor的导入 是xwork2里的
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
public class MyIntercepter implements Interceptor{
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void init() {
// TODO Auto-generated method stub
}
@Override
public String intercept(ActionInvocation arg0) throws Exception {
System.out.println("MyIntercepter.....");
return null;
}
}
package com.inter;
public class MyAction {
public void test() {
System.out.println("This is MyAction......");
}
}
<package name="interceptor" namespace="/" extends="struts-default">
<interceptors>
<interceptor name="inter1" class="com.inter.MyIntercepter"></interceptor>
</interceptors>
<action name="my" class="com.inter.MyAction" method="test">
<interceptor-ref name="inter1"></interceptor-ref>
</action>
</package>
执行结果:
由执行结果可看出 ,MyAction已经被拦截。
在前文中 拦截器类除了实现Intercepter接口外,还可以通过继承 AbstractInterceptor类
public class MyIntercepter2 extends AbstractInterceptor{
@Override
public String intercept(ActionInvocation arg0) throws Exception {
// TODO Auto-generated method stub
System.out.println("MyIntercepter2...");
return null;
}
}
Part Two
拦截器栈的配置:(myStack)
<interceptors>
<interceptor name="inter1" class="com.inter.MyIntercepter"/>
<interceptor name="inter2" class="com.inter.MyIntercepter2"/>
<!-- 定义myStack拦截器栈 -->
<interceptor-stack name="myStack">
<interceptor-ref name="inter1"></interceptor-ref>
<interceptor-ref name="inter2"></interceptor-ref>
</interceptor-stack>
</interceptors>
在Action中引用myStack拦截器栈
<action name="my" class="com.inter.MyAction" method="test">
<interceptor-ref name="myStack"></interceptor-ref>
</action>
测试结果为:
被 inter1拦截后 inter2不被执行 。
在 MyIntercepter程序中加入下面的语句:
运行结果:
Part Three
我们可以定义一个只拦截某个特定方法的拦截器:
如:
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
public class MyIntercepter4 extends MethodFilterInterceptor{
@Override
protected String doIntercept(ActionInvocation arg0) throws Exception {
System.out.println("必须检查.........");
arg0.invoke();
return null;
}
}
Struts.xml配置如下:
<interceptor name="my3" class="com.myinter.MyIntercepter4">
<param name="excludeMethods">sel</param>
<param name="includeMethods">add</param>
</interceptor>