一、目标

1.用Filter模拟处理Request、Response

2.思路细节技巧:

(1)Filter的doFilter方法改为doFilter(Request,Resopnse,FilterChain),有FilterChain引用,为利用FilterChain调用下一个Filter做准备

(2)FilterChain继承Filter,这样,FilterChain既是FilterChain又是Filter,那么FilterChain就可以调用Filter的方法doFilter(Request,Resopnse,FilterChain)

(3)FilterChain的doFilter(Request,Resopnse,FilterChain)中,有index标记了执行到第几个Filter,当所有Filter执行完后request处理后,就会return,以倒序继续执行response处理

二、代码

1.Filter.java

2.HTMLFilter.java

3.SensitiveFilter.java

4.FilterChian.java

5.Request.java

6.Response.java

7.Test.java

1.Filter.java

 public interface Filter {
public void doFilter(Request request, Response response, FilterChain filterChain);
}

2.HTMLFilter.java

 public class HTMLFilter implements Filter {

     @Override
public void doFilter(Request request, Response response,
FilterChain filterChain) {
request.setRequestStr(request.getRequestStr().replace('<', '[').replace(">", "]")+"---HTMLFilter()");
filterChain.doFilter(request, response, filterChain);
response.setResponseStr(response.getResponseStr()+"---HTMLFilter()");
} }

3.SensitiveFilter.java

 public class SensitiveFilter implements Filter {

     @Override
public void doFilter(Request request, Response response,
FilterChain filterChain) {
request.setRequestStr(request.getRequestStr().replace("敏感", "幸福")+"---SensitiveFilter()");
filterChain.doFilter(request, response, filterChain);
response.setResponseStr(response.getResponseStr()+"---SensitiveFilter()");
} }

4.FilterChian.java

 public class FilterChain implements Filter {

     private List<Filter> filters = new ArrayList<Filter>();
int index = 0; //标记执行到第几个filter //把函数的返回值设为FilterChain,返回this,就能方便链式编写代码
public FilterChain addFilter(Filter filter) {
filters.add(filter);
return this;
} public void doFilter(Request request, Response response, FilterChain fc) {
if(index == filters.size()) return ;
Filter f = filters.get(index);
index++;
f.doFilter(request, response, fc);
} }

5.Request.java

 public class Request {

     private String requestStr;

     public String getRequestStr() {
return requestStr;
} public void setRequestStr(String requestStr) {
this.requestStr = requestStr;
} }

6.Response.java

 public class Response {

     private String responseStr;

     public String getResponseStr() {
return responseStr;
} public void setResponseStr(String responseStr) {
this.responseStr = responseStr;
} }

7.Test.java

 public class Test {

     @org.junit.Test
public void testFilter(){ String msg = "<html>敏感字眼</html>"; Request request = new Request();
request.setRequestStr(msg);
Response response = new Response();
response.setResponseStr("response------------"); FilterChain fc = new FilterChain();
fc.addFilter(new HTMLFilter()).addFilter(new SensitiveFilter()); fc.doFilter(request, response, fc);
System.out.println(request.getRequestStr());
System.out.println(response.getResponseStr()); } }

三、执行结果

Java-马士兵设计模式学习笔记-责任链模式-模拟处理Reques Response的更多相关文章

  1. Java-马士兵设计模式学习笔记-责任链模式-FilterChain功能

    一.目标 增加filterchain功能 二.代码 1.Filter.java public interface Filter { public String doFilter(String str) ...

  2. Java-马士兵设计模式学习笔记-责任链模式-处理数据

    一.目标 数据提交前做各种处理 二.代码 1.MsgProcessor.java public class MsgProcessor { private List<Filter> filt ...

  3. Java设计模式学习记录-责任链模式

    前言 已经把五个创建型设计模式和七个结构型设计模式介绍完了,从这篇开始要介绍行为型设计模式了,第一个要介绍的行为型设计模式就是责任链模式(又称职责链模式). 责任链模式 概念介绍 责任链模式是为了避免 ...

  4. 学习笔记——责任链模式ChainOfResponsibility

    责任链模式,主要是通过自己记录一个后继者来判断当前的处理情况.Handler中,再增加一个方法用于设置后继对象,如SetHandler(Handler obj). 然后Handler类以其子类的处理方 ...

  5. 设计模式学习之责任链模式(Chain of Responsibility,行为型模式)(22)

    参考:http://www.cnblogs.com/zhili/p/ChainOfResponsibity.html 一.引言 在现实生活中,有很多请求并不是一个人说了就算的,例如面试时的工资,低于1 ...

  6. Java-马士兵设计模式学习笔记-装饰者模式

    Java装饰者模式简介 一.假设有一个Worker接口,它有一个doSomething方法,Plumber和Carpenter都实现了Worker接口,代码及关系如下: 1.Worker.java p ...

  7. Java-马士兵设计模式学习笔记-总结

    <马士兵设计模式学习>学习了以下模式: 1.装饰者模式(例子:水管工,木工) 2.策略模式(例子:老师用职称比大小.学生用成绩比大小) 3.简单工厂模式(例子:VechileFactory ...

  8. 编写计算器程序学习JS责任链模式

    设计模式中的责任链模式能够很好的处理程序过程的逻辑判断,提高程序可读性. 责任链模式的核心在于责任链上的元素判断能够处理该数据,不能处理的话直接交给它的后继者. 计算器的基本样式: 通过div+css ...

  9. Python使用设计模式中的责任链模式与迭代器模式的示例

    Python使用设计模式中的责任链模式与迭代器模式的示例 这篇文章主要介绍了Python使用设计模式中的责任链模式与迭代器模式的示例,责任链模式与迭代器模式都可以被看作为行为型的设计模式,需要的朋友可 ...

随机推荐

  1. homework-05 大家一起玩游戏~

    046  195 1.接口设计 客户端 用户登录后,启动一个线程来进行游戏,等待服务器信息及发送新数据 服务器  开始时,主程序一直等待用户登录,有新用户登录就开一个线程去为其服务 等到用户都登录完成 ...

  2. SQLite函数详解之二

    sqlite3支持的数据类型: NULL.INTEGER.REAL.TEXT.BLOB 但是,sqlite3也支持如下的数据类型 smallint           16位整数 integer    ...

  3. ORACLE 检查数据库表中是否存在不规范字 段的语句参考.sql

    --查看是否有除number,char,date,varchar2,clob/blob之外的类型,比如:NVARCHAR2,TIMESTAMP(6),FLOATSELECT DISTINCT a.DA ...

  4. 对中级Linux用户有用的20个命令

    1. 命令: Find 搜索指定目录下的文件,从开始于父目录,然后搜索子目录. 注意: -name‘选项是搜索大小写敏感.可以使用-iname‘选项,这样在搜索中可以忽略大小写.(*是通配符,可以搜索 ...

  5. 【BZOJ】【1042】【HAOI2008】硬币购物

    DP+容斥原理 sigh……就差一点…… 四种硬币的数量限制就是四个条件,满足条件1的方案集合为A,满足条件2的方案集合为B……我们要求的就是同时满足四个条件的方案集合$A\bigcap B\bigc ...

  6. GS连接事件

    GS网络连接事件 //网络事件 //这个事件是在libevent里面的收到的事件就是在那个listen里面,就是客户端打开,服务器收到通知 link_stat stat = (link_stat)rP ...

  7. webservice之XFire的使用(java调用java)

    注意:xfire不支持java.util.List等集合,所以调用webservice传递的参数要为基本类型. 转自:http://zp9245.blog.163.com/blog/static/10 ...

  8. VSTO Word2003 添加菜单栏, 添加工具栏

    直接上代码了:   Microsoft.Office.Core.CommandBar menuBar; CommandBarButton ccbtn = null;        CommandBar ...

  9. ACM入门记

    [2015.12]零基础进队 [2016.4.10]浙大第十六届程序设计大赛 [2016.6.4]团体程序设计天梯赛初赛 [2016.7.16]团体程序设计天梯赛决赛 赛后总结:比赛的时候好慌,一道题 ...

  10. Portlet之讲解

    Portlet在Web门户上管理和显示的可插拔的用户界面组件.Portlet产生可以聚合到门户页面中的标记语言代码的片段,如HTML,XML等.通常,根据桌面隐喻,一个门户页面显示为一组互相不重叠的p ...