关于过滤器的一个例子(涉及到装饰模式)

来源:互联网 发布:hse培训矩阵表图片 编辑:程序博客网 时间:2024/05/19 20:20
Decorator设计模式的实现
1.首先看需要被增强对象继承了什么接口或父类,编写一个类也去继承这些接口或父类。
2.在类中定义一个变量,变量类型即需增强对象的类型。
3.在类中定义一个构造函数,接收需增强的对象。
4.覆盖需增强的方法,编写增强的代码。

下面是一个解决全站压缩问题的一个过滤器,关于过滤器的执行过程我就不多说了。
package com.why.web.filter;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.OutputStream;import java.io.OutputStreamWriter;import java.io.PrintWriter;import java.util.zip.GZIPOutputStream;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletOutputStream;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpServletResponseWrapper;import com.sun.org.apache.bcel.internal.generic.NEW;//解决全站压缩问题public class GzipFilter implements Filter {public void init(FilterConfig filterConfig) throws ServletException {}public void doFilter(ServletRequest req, ServletResponse resp,FilterChain chain) throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest)req;HttpServletResponse response = (HttpServletResponse)resp;BufferResponse myresponse = new BufferResponse(response);chain.doFilter(request, myresponse);//拿出缓存中的数据,压缩后再打给浏览器byte[] bytes = myresponse.getBuffer();ByteArrayOutputStream bout = new ByteArrayOutputStream();GZIPOutputStream gzip = new GZIPOutputStream(bout);gzip.write(bytes);gzip.close();byte[] gzipbyte = bout.toByteArray();response.setHeader("content-encoding", "gzip");response.setContentLength(gzipbyte.length);response.getOutputStream().write(gzipbyte);}public void destroy() {}}class BufferResponse extends HttpServletResponseWrapper{private HttpServletResponse response;private ByteArrayOutputStream bout = new ByteArrayOutputStream();private PrintWriter pw;public BufferResponse(HttpServletResponse response) {super(response);this.response = response;}@Overridepublic ServletOutputStream getOutputStream() throws IOException {return new MyServletOutputStream(bout);}@Overridepublic PrintWriter getWriter() throws IOException {pw = new PrintWriter(new OutputStreamWriter(bout,response.getCharacterEncoding()));//pw = new PrintWriter(bout);return pw;}public byte[] getBuffer(){try {if(pw != null){pw.close();}if(bout != null){bout.flush();return bout.toByteArray();}return null;} catch (Exception e) {throw new RuntimeException(e);}}}class MyServletOutputStream extends ServletOutputStream{private ByteArrayOutputStream bout;public MyServletOutputStream(ByteArrayOutputStream bout) {super();this.bout = bout;}@Overridepublic void write(int b) throws IOException {this.bout.write(b);}}


0 0
原创粉丝点击