您的位置:首页 > 其它

设计模式-拦截器模式

2014-01-12 13:08 141 查看
看到strut2的Interceptor(拦截器),
tomcat源码的Valve(tomcat中各种各样容器如Wrapper,Context都是靠Valve实现各种功能),
以及最早学习到的java web中的javax.servlet.Filter的概念,
都是一种链式的处理流程,这一个环节处理完成,然后处理另一个环节,这样就可以在一个处理本身的之前和之后做一些事情了。
比如说,struts2中Action在执行之前会首先执行一些Interceptor,完成诸如权限验证/属性注入/Validation/国际化等等的功能,
我看过一个比较好的功能是,利用strut2的拦截器和*-Validation.xml文件以及标签(strut2标签,主要是form-close.ftl这个模板文件),自动生成页面的Form前端验证。(当然辅助的客户端js文件如jquery/jquery-validation也是需要的)。

以上的这些功能,通过一种名为责任链或者拦截器或者过滤器(语义上的区别而技术上没有什么区别,知道做了什么就行了)的设计模式可以实现,那么就来看看什么是责任链的设计模式。
以下内容参考北京尚学堂的马士兵老师的设计模式视频,在此感谢。

Filter的概念
引入FilterChain的概念
模仿马老师写的代码,

地址1:http://download.csdn.net/detail/hx888/6839619 (filter的单向过滤的简单实现)

地址2:http://download.csdn.net/detail/hx888/6949155 (模仿java web的filter实现双向过滤)
既处理从客户端到服务器的消息,又处理从服务器到客户端的消息,这样的过滤器该怎么设计呢?
首先,构造两个类,Request和Response,分别代表请求和响应,
其次,因为要满足首先执行Request的过滤然后执行Response的过滤以及正序执行Request的过滤和反序执行Response的过滤,所以在doFilter方法中加入FilterChain的引用,
这样可以依次先对Request进行下一个Filter的处理,然后反过来再处理Response的过滤。
模仿马老师写的代码,地址:


分析strut2中interceptorsStack(拦截器栈)
首先,执行action之前会按照顺序执行所有的interceptor,执行action之后返回一个结果字符串也会按照同之前相反的顺序执行所有的interceptor。
我觉得,首先,执行action之后的所有interceptor是必须执行的,且先于对action执行完之后返回的结果进行处理,并且是有严格顺序的。
至于是不是对action执行完之后返回的结果进行处理,以及处理顺序,看到到是次要的?

如果request请求不合乎一个拦截器的请求条件,如权限检查的拦截器,停止后续处理,如何实现?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: