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 ]
[
下一页 ]