一、目标

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

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

2.HTMLFilter.java

  1. public class HTMLFilter implements Filter {
  2.  
  3. @Override
  4. public void doFilter(Request request, Response response,
  5. FilterChain filterChain) {
  6. request.setRequestStr(request.getRequestStr().replace('<', '[').replace(">", "]")+"---HTMLFilter()");
  7. filterChain.doFilter(request, response, filterChain);
  8. response.setResponseStr(response.getResponseStr()+"---HTMLFilter()");
  9. }
  10.  
  11. }

3.SensitiveFilter.java

  1. public class SensitiveFilter implements Filter {
  2.  
  3. @Override
  4. public void doFilter(Request request, Response response,
  5. FilterChain filterChain) {
  6. request.setRequestStr(request.getRequestStr().replace("敏感", "幸福")+"---SensitiveFilter()");
  7. filterChain.doFilter(request, response, filterChain);
  8. response.setResponseStr(response.getResponseStr()+"---SensitiveFilter()");
  9. }
  10.  
  11. }

4.FilterChian.java

  1. public class FilterChain implements Filter {
  2.  
  3. private List<Filter> filters = new ArrayList<Filter>();
  4. int index = 0; //标记执行到第几个filter
  5.  
  6. //把函数的返回值设为FilterChain,返回this,就能方便链式编写代码
  7. public FilterChain addFilter(Filter filter) {
  8. filters.add(filter);
  9. return this;
  10. }
  11.  
  12. public void doFilter(Request request, Response response, FilterChain fc) {
  13. if(index == filters.size()) return ;
  14. Filter f = filters.get(index);
  15. index++;
  16. f.doFilter(request, response, fc);
  17. }
  18.  
  19. }

5.Request.java

  1. public class Request {
  2.  
  3. private String requestStr;
  4.  
  5. public String getRequestStr() {
  6. return requestStr;
  7. }
  8.  
  9. public void setRequestStr(String requestStr) {
  10. this.requestStr = requestStr;
  11. }
  12.  
  13. }

6.Response.java

  1. public class Response {
  2.  
  3. private String responseStr;
  4.  
  5. public String getResponseStr() {
  6. return responseStr;
  7. }
  8.  
  9. public void setResponseStr(String responseStr) {
  10. this.responseStr = responseStr;
  11. }
  12.  
  13. }

7.Test.java

  1. public class Test {
  2.  
  3. @org.junit.Test
  4. public void testFilter(){
  5.  
  6. String msg = "<html>敏感字眼</html>";
  7.  
  8. Request request = new Request();
  9. request.setRequestStr(msg);
  10. Response response = new Response();
  11. response.setResponseStr("response------------");
  12.  
  13. FilterChain fc = new FilterChain();
  14. fc.addFilter(new HTMLFilter()).addFilter(new SensitiveFilter());
  15.  
  16. fc.doFilter(request, response, fc);
  17. System.out.println(request.getRequestStr());
  18. System.out.println(response.getResponseStr());
  19.  
  20. }
  21.  
  22. }

三、执行结果

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. 35.在PCB中删除元件

    在PCB Editor里面,如果想进行什么操作,首先得点击这个命令,再点击你要操作的区域/元件,最后右键选择"Done",这样你才能完成一个操作.

  2. OpenGL Shader源码分享

    Opengl shader程序,旗帜混合纹理加载,通过N张图片,能够组合出数百个:http://www.eyesourcecode.com/thread-39015-1-1.html 用GLSL做了一 ...

  3. Windows Phone 8内存控制研究 之 LonglistSelector使用陷阱

    最近工作中常常被问到如何降低WP内存使用,便再一次开始研究内存问题,首先发现了LonglistSelector使用的一个常见问题: 概述 若将Longlistselector 控件的ItemsSour ...

  4. 卷积神经网络CNN介绍:结构框架,源码理解【转】

    1. 卷积神经网络结构 卷积神经网络是一个多层的神经网络,每层都是一个变换(映射),常用卷积convention变换和pooling池化变换,每种变换都是对输入数据的一种处理,是输入特征的另一种特征表 ...

  5. Spring MVC常用的注解类

    一.注解类配置 要使用springmvc的注解类,需要在springmvc.xml配置文件中用context:component-scan/扫描:  二.五大重要的注解类 1.RequestMapp ...

  6. Hibernate内存溢出分析一例

    公司业务系统在进行压力测试时,压测24小时后系统发生内存溢出.经过分析读dump文件,发现org.hibernate.stat.StatisticsImpl类的hashmap类型的变量存储了大量数据( ...

  7. Using sql azure for Elmah

    The MSDN docs contain the list of T-SQL that is either partially supported or not supported.  For ex ...

  8. Codeforces Round #131 (Div. 1) B. Numbers dp

    题目链接: http://codeforces.com/problemset/problem/213/B B. Numbers time limit per test 2 secondsmemory ...

  9. shell编程之环境变量

    在shell编程里我们首先接触到的是环境变量,常用命令说明 1. 使用echo命令查看单个环境变量.例如: echo $PATH 2. 使用env查看所有环境变量.例如: env 3. 使用set查看 ...

  10. JAVA算法系列 冒泡排序

    java算法系列之排序 手写冒泡 冒泡算是最基础的一个排序算法,简单的可以理解为,每一趟都拿i与i+1进行比较,两个for循环,时间复杂度为 O(n^2),同时本例与选择排序进行了比较,选择排序又叫直 ...