游戏项目中运用到的设计模式(一)装饰者模式
来源:互联网 发布:java graphics类详解 编辑:程序博客网 时间:2024/06/08 04:06
因为项目里面需要对http请求进行多次读取,而HttpServletRequest不支持mark和reset,所以就需要把流存储起来,在每次getInputStream()的时候就用我们自己存储的数据。最开始有两种解决方案:
- 将inputstream转换成byte数组封装在一个类里面,然后将这个类用ThreadLocal进行存储。
- 用装饰者模式,而HttpServletRequestWrapper就是装饰模式的典型例子,我们这里只需要新建一个对象继承HttpServletRequestWrapper将对应的方法进行重写即可。
<pre name="code" class="java">import java.io.BufferedReader;import java.io.ByteArrayInputStream;import java.io.IOException;import java.io.InputStreamReader;import javax.servlet.ServletInputStream;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletRequestWrapper;public class BodyReaderHttpServletRequestWrapper extends HttpServletRequestWrapper {private final byte[] body;public BodyReaderHttpServletRequestWrapper(HttpServletRequest request) throws IOException {super(request);int len = request.getContentLength();if(len < 0) len = 0;body = new byte[len];try {request.getInputStream().read(body);} catch (IOException e) {e.printStackTrace();}}@Overridepublic BufferedReader getReader() throws IOException {return new BufferedReader(new InputStreamReader(getInputStream()));}@Overridepublic ServletInputStream getInputStream() throws IOException {final ByteArrayInputStream bais = new ByteArrayInputStream(body);return new ServletInputStream() {@Overridepublic int read() throws IOException {return bais.read();}};}}
0 0
- 游戏项目中运用到的设计模式(一)装饰者模式
- 生拉硬套设计模式(一),关于装饰者模式在Android项目中的运用。
- 游戏项目中运用到的设计模式(二)...策略模式(strategy)(《重构-改善既有代码的设计》读后做)
- C++设计模式(一)装饰者
- java中装饰者模式的运用实例
- 设计模式之装饰者模式(一)
- 设计模式一日一练:装饰者模式(Decorator)
- 设计模式之装饰者模式(一)
- 项目中使用到的设计模式
- JDK运用到的设计模式
- 设计模式在游戏中的应用--装饰模式(三)
- 设计模式(一)——装饰设计模式
- 设计模式--装饰(者)模式的实际开发实践
- 一些常用的设计模式(装饰者模式)
- 设计模式:装饰者模式(Python)
- 设计模式(装饰者模式)
- 设计模式(装饰者模式)
- 【设计模式】-装饰者模式(Wrapper)
- 《Java虚拟机原理图解》 1.2、class文件中的常量池
- 第八周上机项目6:本月有几天
- Flex在火狐下上传文件报错,IE下正常
- 深入研究Struts2(三)---准备Struts2的学习和开发环境
- Android 中自定义控件和属性(attr.xml,declare-styleable,TypedArray)的方法和使用
- 游戏项目中运用到的设计模式(一)装饰者模式
- msyql binlog 数据恢复
- c/c++内存分配方式
- 第八周项目三多分段函数求值
- unity3d游戏开发之整合vs2008来加快unity c#开发
- sql之left join、right join、inner join的区别
- Android NDK的使用
- 黑马程序员-.NET基础之委托和事件
- Java中图片压缩处理