您的位置:首页 > 编程语言 > Java开发

java 实现Gzip 压缩字符及字节流输出到页面显示

2015-03-12 22:32 603 查看
java过滤器实现Gzip压缩实例源码教程。Gzip是若干种文件压缩程序的简称,我们这里来实现通过javaee中的filter实现对响应数据的压缩,高效的传到客户端,那么是怎么通过Gzip压缩实现的将数据压缩后客户端的,对步骤进行分析:

1.我们把客户端要对用户响应的数据先放在缓存中,

2.然后,通过Gzip将缓存中的数据压缩,

3.在过滤器中通过response的写方法,将数据响应到客户端。

为了模拟:

首先写一个请求的servlet:

package com.zsq.gzip;

import java.io.IOException;

import java.io.PrintWriter;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

public class GzipServlet extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

response.setContentType(“text/html;charset=utf-8″);

String s=”sadgjassssssssssssssssssssssssssssssssssssssss” +

“ssssssaaaaaaaaaaaaaaaaaaasaaaaaaaaaaaaaaaaaaaaaa” +

“saaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasaaaa” +

“assssssssssssssssssssssssssssssssssssssssssaa不是吧”;

//response.getOutputStream().write(s.getBytes(“utf-8″));

response.getWriter().write(s);

}

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

doGet(request, response);

}

}

下面是一个过滤器:

package com.zsq.gzip;

import java.io.ByteArrayOutputStream;

import java.io.IOException;

import java.util.zip.GZIPOutputStream;

import javax.servlet.Filter;

import javax.servlet.FilterChain;

import javax.servlet.FilterConfig;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

public class GzipFilter implements Filter{

public void destroy() {

System.out.println(“压缩过滤开始了”);

}

public void doFilter(ServletRequest req, ServletResponse res,

FilterChain chain) throws IOException, ServletException {

// TODO Auto-generated method stub

HttpServletRequest request=(HttpServletRequest)req;

HttpServletResponse response=(HttpServletResponse)res;

MyResponse mresponse=new MyResponse(response);

chain.doFilter(request, mresponse);

byte[] b=mresponse.getBytes();

System.out.println(“压缩前:”+b.length);

ByteArrayOutputStream out=new ByteArrayOutputStream();

GZIPOutputStream gzipOutputStream=new GZIPOutputStream(out);

gzipOutputStream.write(b);

gzipOutputStream.close();//将数据刷出,如果没有则不显示

byte[]bu=out.toByteArray();

System.out.println(“压缩后:”+bu.length);

response.setHeader(“Content-Encoding”,”gzip”);

response.getOutputStream().write(bu);

}

public void init(FilterConfig filterConfig) throws ServletException {

System.out.println(“压缩过滤结束了。”);

}

}

其中有一个自定义类MyResponse,这个类是对Response的增强类,具体增强的是getOutputStream()和getWriter()这两个方法,通过对这两个方法将数据写到ByteArrayOutputStream中,而不是打印到页面,然后向外提供一个接口得到这个ByteArrayOutputStream对象,通过Gzip压缩,然后响应到客户端;该类的代码:

package com.zsq.gzip;

import java.io.ByteArrayOutputStream;

import java.io.IOException;

import java.io.OutputStreamWriter;

import java.io.PrintWriter;

import java.io.UnsupportedEncodingException;

import javax.servlet.ServletOutputStream;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpServletResponseWrapper;

public class MyResponse extends HttpServletResponseWrapper{

private ByteArrayOutputStream bytes=new ByteArrayOutputStream();//用bytes保存数据

private HttpServletResponse response;

private PrintWriter pw;

public MyResponse(HttpServletResponse response) {

super(response);

// TODO Auto-generated constructor stub

this.response=response;

}

@Override

public ServletOutputStream getOutputStream(){

return new MyServletOutputStream(bytes);//调用自定义类将数据写到bytes中

}

@Override

public PrintWriter getWriter(){

try {

pw=new PrintWriter(new OutputStreamWriter(bytes,”utf-8″));

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

}

return pw;

}

public byte[] getBytes(){//向外提供一个接口得到bytes数据。

if(pw!=null){

pw.close();

return bytes.toByteArray();

}

if(bytes!=null){

try {

bytes.flush();

} catch (IOException e) {

e.printStackTrace();

}

}

return bytes.toByteArray();

}

}

class MyServletOutputStream extends ServletOutputStream{

private ByteArrayOutputStream stream;

public MyServletOutputStream(ByteArrayOutputStream stream){

this.stream=stream;

}

@Override

public void write(int b) throws IOException {

// TODO Auto-generated method stub

stream.write(b);//将数据写到stream中

}

}

web.xml中的配置:

<filter>

<filter-name>GzipFilter</filter-name>

<filter-class>com.zsq.gzip.GzipFilter</filter-class>

</filter>

<filter-mapping>

<filter-name>GzipFilter</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

程序运行截图:



后台打印的结果:



当然这只是为了回顾知识点的,我这个过滤的路径是 /*,一般我们只需要过滤的是:

1./*.jsp;

2./*.css;

3. /*.js

4./*.html;

5./*.htm

这五种,我们可以在web.xml中做相应的配置。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: