您的位置:首页 > 其它

filter修改response学习笔记

2013-06-05 22:46 357 查看
前言:这个是我自己学习《Java Web 整合开发 王者归来》的学习笔记,对你们可能没有参考价值。这是filter那一章中,关于内容替换的filter和GZIP压缩Filter的学习总结。         这两个Filter中对response进行了修改,把这两个例子的代码都重新实现之后,弄懂了基本原理,但是也出现了一些困惑。         大家可以下载《Java Web 整合开发 王者归来》的源代码,查阅filter压缩文件。 内容替换Filter的学习心得         内容替换的原理是,在Servlet将内容输出到response时,response将内容缓存起来,在Filter中进行替换,然后再输出到客户端浏览器,由于默认的response不能严格地将内容缓存起来,因此需要自定义一个具备缓存功能的response。         如果response输出的的内容为字符类内容,则会调用getWrite()方法;如果是二进制内容则会调用getOutputStream()方法;         通过扩展javax.servlet.http.HttpServletResponseWrapper类覆盖其中的getWrite()方法。
package helloJava.gzip;

import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;

import helloJava.gzip.GZipOutputStream;

public class GZipResponseWrapper extends HttpServletResponseWrapper
{

private HttpServletResponse ref_response;

//自定义的outputStream,执行close()的时候对数据压缩,并输出
private GZipOutputStream ref_gzipOutputStream;
//自定义printWriter,将内容输出到GZipOutputStream中
private PrintWriter ref_writer;
public GZipResponseWrapper(HttpServletResponse response)
{
super(response);
// TODO Auto-generated constructor stub
this.ref_response=response;
}

public ServletOutputStream getOutputStream()throws IOException
{
if(ref_gzipOutputStream==null)
ref_gzipOutputStream=new GZipOutputStream(ref_response);
return ref_gzipOutputStream;
}

public PrintWriter getWriter() throws IOException {
if (ref_writer == null)
ref_writer = new PrintWriter(new OutputStreamWriter(
new GZipOutputStream(ref_response), "UTF-8"));
return ref_writer;
}
// 压缩后数据长度会发生变化 因此将该方法内容置空
public void setContentLength(int contentLength) {
}
public void flushBuffer()throws IOException
{
ref_gzipOutputStream.flush();
}
public void finishResponse()throws IOException
{
if(ref_gzipOutputStream!=null)
ref_gzipOutputStream.close();
if(ref_writer!=null)
ref_writer.close();
}
}
GZipResponseWrapper   我困惑的是对于文本文件的压缩是怎么完成的?   对于getWriter()的源代码覆盖代码,中有GZipOutputStream部分,结合GZipResponseWrapper中的Close方法代码,我认为文本类的压缩也是通过GZipOutputStream完成的,而且PrintWriter的write方法可以接受byte[]的参数。 
public PrintWriter getWriter() throws IOException {
if (ref_writer == null)
ref_writer = new PrintWriter(new OutputStreamWriter(
new GZipOutputStream(ref_response), "UTF-8"));
return ref_writer;
}

                                                                       菜包子

                                                                   2013年6月5日22:45:00  于宿舍

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: