游戏项目中运用到的设计模式(一)装饰者模式

来源:互联网 发布:java graphics类详解 编辑:程序博客网 时间:2024/06/08 04:06


因为项目里面需要对http请求进行多次读取,而HttpServletRequest不支持mark和reset,所以就需要把流存储起来,在每次getInputStream()的时候就用我们自己存储的数据。最开始有两种解决方案:

  1. 将inputstream转换成byte数组封装在一个类里面,然后将这个类用ThreadLocal进行存储。
  2. 用装饰者模式,而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
原创粉丝点击