拦截器学习指导

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;
	}

你可能感兴趣的:(配置管理)