打字猴:1.70048503e+09
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
1700485070
1700485071
1700485072 设计模式之禅 38.1.3 值栈
1700485073
1700485074 值栈按道理说应该很简单,就是把HTTP传递过来的String字符串压到堆栈中。听起来很简单,实现起来就比较有难度了,它要完成两个职责:
1700485075
1700485076 ❑管理堆栈
1700485077
1700485078 不仅仅是出栈、入栈这么简单,它要管理栈中数据,同时还要允许前置拦截器对栈中数据进行修改,限制后置拦截器对栈的修改,还要把栈中数据与HTTPServletRequest中的数据建立关联。
1700485079
[ 上一页 ]  [ :1.70048503e+09 ]  [ 下一页 ]