博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java设计模式--责任链模式
阅读量:6261 次
发布时间:2019-06-22

本文共 1681 字,大约阅读时间需要 5 分钟。

  概述:责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象

决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。

  角色:抽象处理者(定义出一个处理请求的接口。如果需要,接口可以定义 出一个方法以设定和返回对下家的引用。这个角色通常由一个Java抽象类或者Java接口实现。),具体执行者(具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家)

  众所周知Tomcat中的Filter就是使用了责任链模式,创建一个Filter除了要在web.xml文件中做相应配置外,还需要实现javax.servlet.Filter接口。

public class TestFilter implements Filter{    public void doFilter(ServletRequest request, ServletResponse response,            FilterChain chain) throws IOException, ServletException {                chain.doFilter(request, response);    }    public void destroy() {    }    public void init(FilterConfig filterConfig) throws ServletException {    }}

   应用:Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter。通过Filter技术,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截。简单说,就是可以实现web容器对某资源的访问前截获进行相关的处理,还可以在某资源向web容器返回响应前进行截获进行处理。

 

 

StandardWrapperValve.invoke()方法

  创建一个过滤器链,并把待执行的servlet对象存放到过滤器链中。

 

  • ApplicationFilterFactory.createFilterChain() 方法

  • 过滤器的顺序是按照web.xml中的先后顺序执行的
  • 把要执行的servlet存放到过滤器链中。
  • 如果没有配置过滤器则return一个空的过滤器链(只包含上面设置的servlet)。
  • 如果配置过滤器,则把所有配置的过滤器加入到过滤器链中
     首先判断filter-mapping中配置的dispatcher规则,如果符合则进入下一步
     然后判断filter-mapping中配置的url-pattern规则,如果符合则添加到过滤器链

 

StandardWrapperValve.invoke()方法

 如果servlet和过滤器链都不为空,则开始调用过滤器链的doFilter() 方法

 

ApplicationFilterChain.doFilter()->internalDoFilter()

pos:为过滤器链中当前执行的过滤器下标。

n:过滤器链中的过滤器个数。

每执行一个过滤器则把过滤器链中的post+1(下标),直到所有的过滤器的doFilter方法都调用成功。

这行代码是责任链设计模式的核心,把当前的过滤链传入到doFilter方法中。

这样在Filter中进行拦截,通过过滤器判断是否要进行调用下一个过滤器链

 

 过滤器链中的所有过滤器的doFilter方法都执行完成后,最后再调用过滤器链中存放的servlet.service()方法。

 

 

转载于:https://www.cnblogs.com/watchdogzhb/p/10566938.html

你可能感兴趣的文章
uva-10879-因数分解
查看>>
python 调用aiohttp
查看>>
跨域iframe高度自适应(兼容IE/FF/OP/Chrome)
查看>>
学习鸟哥的Linux私房菜笔记(8)——文件查找与文件管理2
查看>>
升级fedora 18到fedora 19
查看>>
11月20日学习内容整理:jquery插件
查看>>
SVN与TortoiseSVN实战:补丁详解
查看>>
获取页面中所有dropdownlist类型控件
查看>>
读《淘宝数据魔方技术架构解析》有感
查看>>
[转载]如何破解Excel VBA密码
查看>>
【BZOJ】2563: 阿狸和桃子的游戏
查看>>
redis 中文字符显示
查看>>
顺序图【6】--☆☆
查看>>
Docker Swarm 让你事半功倍
查看>>
javaScript事件(四)event的公共成员(属性和方法)
查看>>
Oracle SID爆破工具SidGuess
查看>>
批处理常用命令总结2
查看>>
Android -- 自定义View小Demo,绘制钟表时间(一)
查看>>
信息检索Reading List
查看>>
自动精简配置&重复数据删除核心技术点及其经济效应探究
查看>>