struts2以可插拔式来管理action需要完成的通用操作。
系统为拦截器指定参数的两种形式:
(1)定义拦截器时指定参数值(<intercepter ...>)
(2)使用拦截器时指定参数值(<intercepter-ref ...>)
配置默认拦截器
<default-interceptor-ref name="defaultStack"/>做为包的子元素
在有时,如权限,日志等都要用到自定义拦截器。
自定义拦截器需要实现com.opensymphony.xwork2.interceptor.Interceptor
public interface Interceptor extends Serializable {
void destroy();
void init();
String intercept(ActionInvocation invocation) throws Exception;
}
除此之外还提供AbstractInterceptor类,该类实现了Interceptor接口,该类提供了一个destory()和init()的空实现
当我们实现intercept(ActionInvocation invocation)方法时,可以获得invocation参数,这个参数可以获得被拦截的action实例,一旦取得Action,几乎获得了全部的控制权
注意如果为Action指定了一个拦截器,则系统默认拦截器或拦截器栈会失去作用,还需要手动引入默认拦截器
加入一拦截器栈多个引用拦截器出现参数名一样的情况啥办?
参数名换成:<拦截器名>.<参数名>
深入拦截器
如果我们为某个Action定义了拦截器,则该拦截器会拦截Action的所有方法(execute,method定义的方法)
方法过滤:MethodFilterInterceptor该类是AbstractInterceptor子类,该类重写了intercept方法
public String intercept(ActionInvocation invocation) throws Exception {
if (applyInterceptor(invocation)) {
return doIntercept(invocation);
}
return invocation.invoke();
}
...
public void setIncludeMethods(String includeMethods)
...
public void setExcludeMethods(String excludeMethods)
...
也就是说我们需要重写doIntercept方法。上面两个set方法,一个是需要拦截的方法,一个是不需要拦截的方法。只需在指定参数即可
注意:如果一个方法同时出现在includeMethods和excludeMethods,则该方法会被拦截
拦截器的执行顺序:配置在前面的拦截器,在被拦截方之前的拦截动作,将会先起作用;如果是在拦截方法之后的拦截动作,将会后对用户起作用
拦截结果的监听器
为了精确定义在execute方法执行结束后,在处理result执行的动作,struts2提供了用于拦截结果的监听器,这个监听器是通过手动注册到拦截内部的
public class myIterceptorListener implements PreResultListener{
public void beforeResult(ActionInvocation invocation, String resultCode) {
System.out.println("逻辑视图返回 "+resultCode);
}
}
..
public String intercept(ActionInvocation invocation) throws Exception {
invocation.addPreResultListener(new myIterceptorListener());//注册拦截器监听器
converAction co=(converAction)invocation.getAction();
System.out.println(name+"拦截器开始时间:"+new Date());
long start=System.currentTimeMillis();
//执行该拦截器的下一个拦截器,或者直接ACTION的execute方法
String result=invocation.invoke();
System.out.println(name+"拦截器的动作---"+"执行完Action的时间为"+new Date());
long end=System.currentTimeMillis();
System.out.println(name+"拦截器执行完Action所用时间"+(end-start)+"毫秒");
return result;
}