责任链的设计模式可以参考Servlet的FilterChain。FilterChain中的每个Filter(过滤器)就像一个个的链条

web开发中 有时候需要对接口request和response进行过滤操作(特殊字符过滤,权限过滤等)

  doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
          The doFilter method of the Filter is called by the container each time a request/response pair is passed through the chain due to a client request for a resource at the end of the chain.

  过滤器Filter中doFliter方法完成实际的过滤操作,通过参数FilterChain把多个过滤器串联起来。

  doFilter(ServletRequest request, ServletResponse response) 
          Causes the next filter in the chain to be invoked, or if the calling filter is the last filter in the chain, causes the resource at the end of the chain to be invoked.

  执行fliterChain的doFilter方法,会执行下一个filter的doFilter方法同时FliterChain会当做参数传给下一个Filter。(Filter的执行循序 和在web.xml配置的顺序一致)

责任链设计模式的特点是

过滤器Filter1

code11

chain.doFilter()

code12

过滤器Filter2

code21

chain.doFilter()

code22

Servlet的request请求 Servlet的resopnse响应

执行code11后通过chain.doFilter()方法,

代码会到Filter2中去

然后执行code21(如果有下一个filter 会接着执行下一个filter)

执行完所有的过滤器之后 开始response返回

先从最末的一个过滤器开始返回

于是response时候的代码执行顺序是code22  code12

上面的执行顺序会是 code11 code21  code22 code12 FilterChain通过参数传递起到串联所有Filter的作用,通过执行chain.doFilter()来进入下一个Filter

chain.doFilter()以上的代码是对resquest进行过滤,以下的代码对返回response过滤

代码证明:

1.首先声明一个Servlet

package javaee.net.cn.websocket;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyServlet extends HttpServlet { private static final long serialVersionUID = 1L; @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {;
System.out.println("doGet>>>>>>>>>>>>>>>>>>");
} }

2.声明两个过滤器

package javaee.net.cn.websocket;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse; public class NoteFilter implements Filter { @Override
public void destroy() {
System.out.println("note destory<<<<<<<<<<<<<<<<"); } @Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
System.out.println("request note filter");
chain.doFilter(request, response);
System.out.println("response note filter"); } @Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("note init<<<<<<<<<<<<<<"); } }
package javaee.net.cn.websocket;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse; public class HtmlFilter implements Filter { @Override
public void destroy() {
System.out.println("html destory<<<<<<<<<<<<<<<<"); } @Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
System.out.println("request html filter");
chain.doFilter(request, response);
System.out.println("response html filter"); } @Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("html init<<<<<<<<<<<<<<"); } }

3.在web.xml中配置Servlet和过滤器(在web.xml中 必须先配置所有的过滤器 在配置Servlet)

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>Tab3</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
</welcome-file-list>
<filter>
<filter-name>NoteFilter</filter-name>
<filter-class>javaee.net.cn.websocket.NoteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>NoteFilter</filter-name>
<url-pattern>/myServlet</url-pattern>
</filter-mapping> <filter>
<filter-name>HtmlFilter</filter-name>
<filter-class>javaee.net.cn.websocket.HtmlFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HtmlFilter</filter-name>
<url-pattern>/myServlet</url-pattern>
</filter-mapping>
<!--上面配置fliter 下面配置Servlet -->
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>javaee.net.cn.websocket.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/myServlet</url-pattern>
</servlet-mapping>
</web-app>

4.浏览器输入web.xml配置的url路径:http://127.0.0.1:8080/myServlet

输出结果是:

request note filter
request html filter
doGet>>>>>>>>>>>>>>>>>>
response html filter
response note filter

和上面分析一致

JDK设计模式之——责任链(Filter)的更多相关文章

  1. 乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern)

    原文:乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 责任链模式(Chain of R ...

  2. php设计模式之责任链模式

    php设计模式之责任链模式 实际问题 你的论坛有举报功能,版主能解决粗口方面的举报,警察能解决严重一点的黄赌毒方面的举报,更严重的反政府的举报就需要由国安局来完成. 职场中每个人都有直属的上级,如果到 ...

  3. python设计模式之责任链模式

    python设计模式之责任链模式 开发一个应用时,多数时候我们都能预先知道哪个方法能处理某个特定请求.然而,情况并非总是如此.例如,想想任意一种广播计算机网络,例如最早的以太网实现.在广播计算机网络中 ...

  4. JAVA设计模式之责任链模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其 ...

  5. 【GOF23设计模式】责任链模式

    来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_责任链模式.公文审批.供应链系统的采购审批.异常链.过滤器和拦截器调用过程 package com.test.chainO ...

  6. Java设计模式之责任链设计模式

    职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将所有处理对象连成一条链,并沿着这条链传递请求,直到有一个对象处理 ...

  7. C#设计模式:责任链模式

    设计模式是面向对象编程的基础,是用于指导程序设计.在实际项目开发过程中,并不是一味将设计模式进行套用,也不是功能设计时大量引入设计模式.应该根据具体需求和要求应用适合的设计模式.设计模式是一个老话题了 ...

  8. 详解java设计模式之责任链模式

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt175 从击鼓传花谈起 击鼓传花是一种热闹而又紧张的饮酒游戏.在酒宴上宾客依次 ...

  9. Head First设计模式之责任链模式

    一.定义 避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止. 主要解决:职责链上的处理者负责处理请求,客户只需要将请求 ...

随机推荐

  1. H5端密码控件自动化测试

    最近在做H5端UI自动化测试,其中遇到了一个棘手问题就是密码控件,因为密码控件的按钮每次都是随机不一样的,没法固定去点击输入密码.密码的输入框是div不是input,所以没法用send_keys()这 ...

  2. windbg排查大内存

    现在都是用windbg preview,安装比较麻烦了,还要配置环境变量, 并且每次分析前要先执行 !analyze - v !eeheap -gc !DumpHeap -min 500 000002 ...

  3. 洛谷 P1338 末日的传说

    题目链接:https://www.luogu.org/problemnew/show/P1338 题目描述 只要是参加jsoi活动的同学一定都听说过Hanoi塔的传说:三根柱子上的金片每天被移动一次, ...

  4. 关于python,完善我计算机知识的一步。

    因为身为理科男,所以特别喜欢涉及其他领域的知识.而对我来说,计算机是很有诱惑力的--尤其是程序语言设计,懂得一门“外语”是多么的重要.大一时候接触过包括有计算机的基本知识,c语言,这个新的学期也开始接 ...

  5. JAVA微信支付~

    1,简单说明 现在好多项目上都需要用到微信支付接口,官方文档上也是简单的描述了下,技术不高深的真的难以理解(我自己看官方文档就看不懂),还是需要自己收集,总结, 网上看了好多 有些照着弄最后还是没法成 ...

  6. 【Selenium】【BugList6】调用IE,未启用保护模式,报:selenium.common.exceptions.WebDriverException: Message: Unexpected error launching Internet Explorer. Protected Mode settings are not the same for all zones.

    >>> driver = webdriver.Ie() 解决方法: 1.打开Ie浏览器 , 工具 ->Internet选项 ->安全 2.去掉4个区域的安全保护模式

  7. inet_pton, inet_ntop

    Linux下这2个IP地址转换函数,可以在将IP地址在“点分十进制”和“整数”之间转换而且,inet_pton和inet_ntop这2个函数能够处理ipv4和ipv6.算是比较新的函数了. inet_ ...

  8. Oracle 12c 安装问题及解决方案

    1. 介绍 今天在我的开发电脑上安装Oracle12c,电脑环境是windows10家庭中文版,安装的Oracle数据库版本Oracle(12.1.0.2.0) - Standard Edition ...

  9. spring的一个小例子(二)--解析前面的小例子

    接上篇:http://www.cnblogs.com/xuejupo/p/5236448.html 首先应该明白,一个web项目,web.xml是入口. 然后下面来分析上篇博客中出现的web.xml: ...

  10. 3.11formdata的使用

    var formData = new FormData(); formData.append('files[]',document.getElementById("file").f ...