1700484970
1700484971
//当前的值栈
1700484972
1700484973
protected ValueStack getValueStack(){
1700484974
1700484975
return valueStack;
1700484976
1700484977
}
1700484978
1700484979
//拦截处理
1700484980
1700484981
public final void exec(){
1700484982
1700484983
//根据type不同,处理方式也不同
1700484984
1700484985
}
1700484986
1700484987
//拦截器类型
1700484988
1700484989
protected abstract void setType(int type);
1700484990
1700484991
//子类实现的拦截器
1700484992
1700484993
protected abstract void intercept();
1700484994
1700484995
}
1700484996
1700484997
这怎么和Struts的拦截器不相同呀!是的,Struts的拦截器的拦截方法intercept是要接收一个ActionInvocation对象,这里却没有,我们主要是讲解模式,是为了技术实现,而类似Struts的MVC框架属于工业级别的应用框架,考虑了太多的外界因素。拦截器分为三种:
1700484998
1700484999
❑前置拦截器
1700485000
1700485001
在Action调用前执行,对Action需要的场景数据进行过滤或重构。
1700485002
1700485003
❑后置拦截器
1700485004
1700485005
在Action调用后执行,负责回收场景,或对Action的后续事务进行处理。
1700485006
1700485007
❑环绕拦截器
1700485008
1700485009
在Action调用前后都执行。
1700485010
1700485011
我们的框架在这里使用了一个模板方法模式,开发者继承AbstractInterceptor后,只要完成两个职责即可:定义拦截类型(setType)和实现拦截器要拦截的方法(intercept),不用考虑它到底如何调用ActionInvocation,相对来说简单又实用。
1700485012
1700485013
有拦截器就肯定有拦截器链,多个拦截器组合在一起就成了拦截器链,如代码清单38-16所示。
1700485014
1700485015
代码清单38-16 拦截器链
1700485016
1700485017
public class Interceptors implements Iterable<AbstractInterceptor>{
1700485018
1700485019
//根据拦截器列表建立一个拦截器链
[
上一页 ]
[ :1.70048497e+09 ]
[
下一页 ]