Struts2学习笔记(八)

拦截器原理模拟

首先,让我们来看看strutsinterceptor运行过程,如图:

从这个图我们可以清楚的看到,doFilter调用Dispatcher中的serviceAction方法ValueStack stack = (ValueStack) request.getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY);得到值栈中的值并且创建了ActionProxy并且调用execute方法,而ActionProxy则调用ActionInvocation中的invoke方法,ActionInvocation又调用了exceptionInterceptor中的interceptor方法,而exceptionInterceptor又反过来调用了ActionInvocation中的invoke方法,直到所有的interceptor都已执行,最后才调用TestAction中的execute方法。

我们模拟代码如下,首先建立一个Interceptor接口:

public interface Interceptor {
	public void intercept(ActionInvocation invocation);
}

然后建立两个interceptor来实现这个接口,FirstInterceptor代码如下:

public class FirstInterceptor implements Interceptor{

	public void intercept(ActionInvocation invocation) {
		System.out.println(1);
		invocation.invoke();
		System.out.println(-1);
	}
}

SecondInterceptor代码如下:

public class SecondInterceptor implements Interceptor{

	public void intercept(ActionInvocation invocation) {
		System.out.println(2);
		invocation.invoke();
		System.out.println(-2);
	}
}

然后建立一个ActionInvocation类代码如下:

public class ActionInvocation {
	List<Interceptor> interceptors = new ArrayList<Interceptor>();
	int index = -1;
	Action a = new Action();
	
	public ActionInvocation(){
		this.interceptors.add(new FirstInterceptor());
		this.interceptors.add(new SecondInterceptor());
	}
	
	public void invoke(){
		index++;
		if(index>=this.interceptors.size()){
			a.execute();
		}else{
			
			this.interceptors.get(index).intercept(this);
		}
	}
}

从代码中可以看到,invoke方法中反复从List中取出Interceptor对象并调用它的intercept方法,直到所有的都调用完毕才调用Actionexecute方法。

其中Action的代码如下:

public class Action {
	public void execute(){
		System.out.println("execute!");
	}
}






 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值