码迷,mamicode.com
首页 > 其他好文 > 详细

数据的压缩1 (52)

时间:2015-05-01 11:57:36      阅读:89      评论:0      收藏:0      [点我收藏+]

标签:

第四步:修改包装类Myresponse2,让输出数据放到一个内存缓存区中

package cn.hongxin.filter;

public class GzipFilter2 implements Filter {
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        HttpServletResponse resp= (HttpServletResponse) response;
        //声明包装类对象
        MyResponse2 myresp = new MyResponse2(resp);
        //放行,调用oneServlet.doGet
        chain.doFilter(request, myresp);
         
        //第二步:从myresp2中读取原生的数据
        byte[] src = myresp.getSrc(); 
        
        //第三步:开始压缩
        ByteArrayOutputStream destBytes = new ByteArrayOutputStream();
        GZIPOutputStream zip = new GZIPOutputStream(destBytes);
        zip.write(src);
        zip.close();
        
        //第三步:输出-使用原生的response
        resp.setContentType("text/html;charset=UTF-8");
        //获压缩以后数据
        byte[] dest = destBytes.toByteArray();
        System.err.println("压缩之前:"+src.length);
        System.err.println("压缩以后:"+dest.length);
        //设置头
        resp.setContentLength(dest.length);
        resp.setHeader("Content-Encoding","gzip");
        //输出
        OutputStream out = resp.getOutputStream();
        out.write(dest);
    }
    public void destroy() {
    }
}
//第一步:声明response的包装类
class MyResponse2 extends HttpServletResponseWrapper{
    //将这个容器/a.txt,声明成员变量
    private ByteArrayOutputStream srcByte;
    public MyResponse2(HttpServletResponse response) {
        super(response);
    }
    //修改增强getWtier方法
    @Override
    public PrintWriter getWriter() throws IOException {
        srcByte = new ByteArrayOutputStream();
        PrintWriter out = 
                new PrintWriter(
                        new OutputStreamWriter(srcByte, "UTF-8"));
        return out;
    }
    //提供一个方法获取原生 的数据
    public byte[] getSrc(){
        return srcByte.toByteArray();
    }
}

第五步:全部的jsp都要经过压缩

只要是通过包装rersponse,且修改了getWriter方法,返回一个自己的printwiter对象。声明一个放原数据的容器对象。就可以实现数据压缩。

public class GzipFilter2 implements Filter {
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        HttpServletResponse resp= (HttpServletResponse) response;
        //声明包装类对象
        MyResponse2 myresp = new MyResponse2(resp);
        //放行,调用oneServlet.doGet
        chain.doFilter(request, myresp);
        
        //第二步:从myresp2中读取原生的数据
        byte[] src = myresp.getSrc();
        
        //第三步:开始压缩
        ByteArrayOutputStream destBytes = new ByteArrayOutputStream();
        GZIPOutputStream zip = new GZIPOutputStream(destBytes);
        zip.write(src);
        zip.close();
        
        //第三步:输出-使用原生的response
        resp.setContentType("text/html;charset=UTF-8");
        //获压缩以后数据
        byte[] dest = destBytes.toByteArray();
        System.err.println("压缩之前:"+src.length);
        System.err.println("压缩以后:"+dest.length);
        //设置头
        resp.setContentLength(dest.length);
        resp.setHeader("Content-Encoding","gzip");
        //输出
        OutputStream out = resp.getOutputStream();
        out.write(dest);
        
    
    }
    public void destroy() {
    }

}
//第一步:声明response的包装类
class MyResponse2 extends HttpServletResponseWrapper{
    //将这个容器/a.txt,声明成员变量
    private ByteArrayOutputStream srcByte;
    private PrintWriter out; 
    public MyResponse2(HttpServletResponse response) {
        super(response);
    }
    //修改增强getWtier方法
    @Override
    public PrintWriter getWriter() throws IOException {
        srcByte = new ByteArrayOutputStream();
        out = 
                new PrintWriter(
                        new OutputStreamWriter(srcByte, "UTF-8"));
        return out;
    }
    //提供一个方法获取原生 的数据
    public byte[] getSrc(){
        if(out!=null){
            out.close();
        }
         return srcByte.toByteArray();
    }
}

且它的配置如下:

<filter>

    <filter-name>zip2</filter-name>

    <filter-class>cn.itcast.filter.GzipFilter2</filter-class>

  </filter>

  <filter-mapping>

    <filter-name>zip2</filter-name>

    <url-pattern>*.jsp</url-pattern>

  </filter-mapping>

同时实现对getoutputstream和getWtier压缩

在myrespons2这个类中,对getoutputstream也要覆盖。

       返回一个ServletOutputSteam的匿名对象。

       实现witer(int b)方法,将数据写到bytearrayoyutpoutstream.

    public ServletOutputStream getOutputStream() throws IOException {

       srcByte = new ByteArrayOutputStream();

       ServletOutputStream out = new ServletOutputStream() {

           //所有IO最终都是一个个字节写出信息

           @Override

           public void write(int b) throws IOException {

              System.err.println(">>>:"+b);

              srcByte.write(b);//写到自己的缓存中去-相当于StringBuffer.append(""+b);

           }

       };

       return out;

    }

数据的压缩1 (52)

标签:

原文地址:http://www.cnblogs.com/zhenghongxin/p/4470456.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!