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在执行前后都会被拦截器过滤一遍,即使不符合拦截条件的也会被检查一遍,所以非必要情况不要使用拦截器。
1700485050
1700485051
由于在XML配置文档中有太多的拦截器链,因此需要有一个工厂来创建它,否则太繁琐。如代码清单38-17所示。
1700485052
1700485053
代码清单38-17 拦截器链工厂
1700485054
1700485055
public class InterceptorFactory{
1700485056
1700485057
public static ArrayList<Interceptors>createInterceptors(){
1700485058
1700485059
//根据配置文件创建出所有的拦截器链
1700485060
1700485061
return null;
1700485062
1700485063
}
1700485064
1700485065
}
1700485066
1700485067
它的作用是根据配置文件一次性地创建出所有的拦截器,很简单的工厂方法模式。如果读者还记得我们刚刚讲的配置文件更新问题的话,应该想到这里也应该有一个观察者,配置文件修改了,拦截器链当然也要重建了,确实应该有这样一个观察者,读者可以自行思考如何实现。
1700485068
1700485069
[
上一页 ]
[ :1.70048502e+09 ]
[
下一页 ]