• 设计模式-拦截器模式


    看到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请求不合乎一个拦截器的请求条件,如权限检查的拦截器,停止后续处理,如何实现?

  • 相关阅读:
    Div添加滚动条
    JAVA正则表达式 Pattern和Matcher类
    颜色代码对应表
    Java排序方法
    Windows切换窗口
    SVN错误信息汇总
    @RequestMapping 用法详解
    java——国际化详解
    Java NIO学习笔记九 NIO与IO对比
    ROS学习笔记十二:使用gazebo在ROS中仿真
  • 原文地址:https://www.cnblogs.com/wenwujuncheng/p/3515833.html
Copyright © 2020-2023  润新知