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
//根据拦截器列表建立一个拦截器链
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容器自己实现的,而拦截器链则需要我们自己编码实现。代码不复杂,读者可以参考责任链章节。
[
上一页 ]
[ :1.700484994e+09 ]
[
下一页 ]