基本步骤
1、自定义一个类,直接或间接实现Interceptor接口
(间接实现:继承AbstractInterceptor类)
2、在struts.xml中注册自定义的拦截器类
<interceptors>
<interceptor
name="myInterceptor"
class="com.rain.interceptor.MyInterceptor" />
<interceptor
name="interceptor"//名字自定义
class="com.rain.interceptor.Interceptor2" />//类的全路径名
</interceptors>
3、在需要使用拦截器的Action中****引用已注册的拦截器
<action
name="my"
class="com.rain.action.MyAction">
<interceptor-ref name="my"></interceptor-ref>
<result name="success" type="chain">next</result>
</action>
Interceptor
实现Interceptor 接口的,必须实现所有方法。
public interface Interceptor extends Serializable {
void destroy();
void init();
String intercept(ActionInvocation invocation) throws Exception;
}
public class Interceptor2 implements Interceptor {
@Override
public String intercept(ActionInvocation invocation) throws Exception {
return invocation.invoke();
}
@Override
public void destroy() {}
@Override
public void init() {}
}
方法介绍
Øvoid init():
该方法在拦截器实例创建后、intercept()方法被调用之前调用,用于初始化拦截器所需要的资源,例如数据库连接的初始化。该方法只执行一次。
Øvoid destroy():
该方法在执行Action之后,拦截器实例被销毁之前调用,用于释放在init()方法中分配的资源。该方法只执行一次。
ØString intercept(ActionInvocation invocation) throws Exception:
- 该方法在Action执行之前被调用,利用invocation参数,可以获取action执行的状态。
- 在intercept()方法中,如果要继续执行后续的部分(包括余下的应用于Action的拦截器、Action和Result),可以调用invocation.invoke()。
- 如果要终止后续的执行,可以直接返回一个结果码,框架将根据这个结果码来呈现对应的结果视图。需要调用
invocation.invoke()
*【ActionInvocation常用方法】
1、public Object getAction():获取Action组件实例
2、public ActionContext getInvocationContext():获取Action运行环境,从而可获取各种Web元素。
3、public String invoke():如果有可调用的拦截器,则调用下一个拦截器,如果没有可调用的拦截器,则调用Action的业务方法。
AbstractInterceptor
- 实现AbstractInterceptor抽象类的,只需重写intercept方法即可。
- 它实现了Interceptor接口,并给出了init()和destroy()方法的空实现。拦截器类也可以选择继承AbstractInterceptor类,那么你只需要重写抽象的intercept()方法就可以了。
public abstract class AbstractInterceptor implements Interceptor {
public void init() {}
public void destroy() {}
public abstract String intercept(ActionInvocation invocation) throws Exception;
}
Struts2还提供了一个特殊的拦截器抽象基类
com.opensymphony.xwork2.interceptor.MethodFilterInterceptor
这个拦截器可以指定要拦截或排除的方法列表。一般,拦截器将拦截Action的所有方法调用,但在某些情况,对某些方法的拦截将会出现一些问题。
例如:对表单字段进行验证的拦截器,当我们通过doDefault()方法输出表单时,该方法不应该被拦截,因此此时表单字段都没有数据。
- excludeMethods 排除
- includeMethods 拦截
<interceptor-ref name="validation">
<param name="excludeMethods">input,back,cancel</param>
<param name="includeMethods">execute</param>
</interceptor-ref>
- 当执行Action的input、back和cancel方法时,验证拦截器将不执行对输入数据的验证。
- 当执行Action的execute方法时,验证拦截器将执行对输入数据的验证。
- 在设置拦截器或排除的方法时,如果有多个方法,那么以逗号(,)分隔。
- 如上所示。如果一个方法的名字同时出现在execludeMethods和includeMethods参数中,那么它会被当作要拦截的方法。也就是说, includeMethods优先于execludeMethods。
案例
编写拦截器
com.rain.interceptor.MyInterceptor
public class MyInterceptor extends AbstractInterceptor {
private static final long serialVersionUID = 1L;
@Override
public String intercept(ActionInvocation invocation) throws Exception {
System.out.println("自定义拦截器开始运行!");
long startTime=System.currentTimeMillis();
System.out.println("开始时间为:"+startTime);
String result=invocation.invoke();
System.out.println("自定义拦截器已经结束!");
long endTime=System.currentTimeMillis();
System.out.println("结束时间为:"+endTime);
System.out.println("程序执行花费了:"+(endTime-startTime));
return result;
}
}
com.rain.interceptor.Interceptor2
public class Interceptor2 extends AbstractInterceptor {
@Override
public String intercept(ActionInvocation invocation) throws Exception {
// TODO Auto-generated method stub
System.out.println("执行第二个拦截器");
return invocation.invoke();
}
}
xml
<package
name="interceptor"
namespace="/"
extends="struts-default">
<interceptors>
<interceptor
name="myInterceptor"
class="com.rain.interceptor.MyInterceptor" />
<interceptor
name="interceptor"
class="com.rain.interceptor.Interceptor2" />
<interceptor-stack name="my">
<interceptor-ref name="myInterceptor"></interceptor-ref>
<interceptor-ref name="interceptor"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<action
name="my"
class="com.rain.action.MyAction">
<interceptor-ref name="my"></interceptor-ref>
<param name="aaa">你好aaa</param>
<result name="success" >my.jsp</result>
</action>
</package>
Action
public class MyAction extends ActionSupport {
private static final long serialVersionUID = 1L;
public String aaa;
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
System.out.println("程序正在执行action");
System.out.println("aaa的值"+this.aaa);
return super.execute();
}
}