欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

拦截器学习指导

程序员文章站 2022-04-20 09:01:06
...
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;
}
相关标签: 配置管理