打字猴:1.700485e+09
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 //根据拦截器列表建立一个拦截器链
1700485020
1700485021 public Interceptors(ArrayList<AbstractInterceptor>list){
1700485022
1700485023 }
1700485024
1700485025 //列出所有的拦截器
1700485026
1700485027 public Iterator<AbstractInterceptor>iterator(){
1700485028
1700485029 return null;
1700485030
1700485031 }
1700485032
1700485033 //拦截器链的执行方法
1700485034
1700485035 public void intercept(){
1700485036
1700485037 //委托拦截器执行
1700485038
1700485039 }
1700485040
1700485041 }
1700485042
1700485043 它实现了Iterable接口,提供了一个方便遍历拦截器的方法,这是迭代器模式。同时,由于是一个链结构,我们就想到了责任链,这里确实也是一个责任链模式,只是核心控制器上的过滤链是Servlet容器自己实现的,而拦截器链则需要我们自己编码实现。代码不复杂,读者可以参考责任链章节。
1700485044
1700485045 这里还有两个很有意思的方法。我们来看构造函数,它通过一个容纳有拦截器的动态数组生成一个拦截器链,它是一个自激行为,在XML文件中配置一个拦截器,其中包含多个拦截器,我们的构造函数就是这样的用途,自己建立一条链,而不是父类或者高层模块。再看intercept方法,链中每个节点都是一个拦截器,都有一个intercept方法,拦截器链中的intercept方法行为是委托第一个节点拦截器的intercept方法,然后所有的拦截器都会按照顺序执行一遍,这一点和我们的责任链模式是不同的,责任链模式是只要有节点处理就可以认为是结束,后续节点可以不再参与处理。
1700485046
1700485047 Struts还实现了方法拦截器,只要继承MethodFilterInterceptor即可,主要使用了反射技术,有兴趣的话可以看看源代码。注意我们这里使用了拦截器链而不像Struts那样是拦截器栈,一字之差,系统设计差别可就大了。
1700485048
1700485049 注意 拦截器是会影响系统性能的,所有的Action在执行前后都会被拦截器过滤一遍,即使不符合拦截条件的也会被检查一遍,所以非必要情况不要使用拦截器。
[ 上一页 ]  [ :1.700485e+09 ]  [ 下一页 ]