`

servlet 以 gzip 格式返回数据

阅读更多
servlet 以 gzip 格式 返回结果

servlet 可以通过 gzip 格式返回结果,前提是 浏览器支持 gzip 格式,

------
gzip 格式返回数据的 步骤:

* 判断浏览器是否支持 gzip 格式
根据 header 中的 accept-encoding 属性 是否包含 "gzip" 字符 进行判定,
* 设置 返回的编码为 gzip 格式
设置 header 的 content-encoding 属性 的值为 "gzip",
* 创建支持 gzip 格式的输出流对象
可以通过 GZIPOutputStream 这个适配器类 创建 PrintWriter 对象,实现 gzip 格式输出,
例子:
PrintWriter pw = new PrintWriter(new GZIPOutputStream(resp.getOutputStream()));
* 输出内容
* 关闭 输出流
一定要调用 PrintWriter 对象的 close() 方法关闭输出流,否则 数据不能返回到浏览器端,
*

------
servlet gzip 工具类

* 逻辑:
提供2个方法:
* 判断浏览器是否支持 gzip 压缩
* 返回支持 gzip 压缩的 PrinterWriter 对象,如果浏览器不支持 gzip 则返回普通的 PrinterWriter 对象,
*

* 工具类 代码:
ServletGzipUtil.java

	package eric.servlet.util;
	import java.io.IOException;
	import java.io.PrintWriter;
	import java.util.zip.GZIPOutputStream;
	import javax.servlet.http.HttpServletRequest;
	import javax.servlet.http.HttpServletResponse;
	/**
	 * servlet 的 gzip 工具类
	 * @author eric
	 * @date 2010-9-14 下午07:53:20
	 */
	public class ServletGzipUtil {
		/**
		 * 判断浏览器是否支持 gzip 压缩
		 * @param req
		 * @return boolean 值
		 */
		public static boolean isGzipSupport(HttpServletRequest req) {
			String headEncoding = req.getHeader("accept-encoding");
			if (headEncoding == null || (headEncoding.indexOf("gzip") == -1)) { // 客户端 不支持 gzip
				return false;
			} else { // 支持 gzip 压缩
				return true;
			}
		}

		/**
		 * 创建 以 gzip 格式 输出的 PrintWriter 对象,如果浏览器不支持 gzip 格式,则创建普通的 PrintWriter 对象,
		 * @param req
		 * @param resp
		 * @return
		 * @throws IOException
		 */
		public static PrintWriter createGzipPw(HttpServletRequest req, HttpServletResponse resp) throws IOException {
			PrintWriter pw = null;
			if (isGzipSupport(req)) { // 支持 gzip 压缩
				pw = new PrintWriter(new GZIPOutputStream(resp.getOutputStream()));
				// 在 header 中设置返回类型为 gzip
				resp.setHeader("content-encoding", "gzip");
			} else { // // 客户端 不支持 gzip
				pw = resp.getWriter();
			}
			return pw;
		}
	}


------
firefox 中查看 gzip 结果:
在 firebug 中可以通过 网络 tab 看到 请求的细节,
可以看到 响应头信息 中的 Content-Encoding 值为 gzip,且 Content-Length 的值比不使用 gzip 时要小,

------
例子:

      * 代码写在 servlet 中

		protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
			PrintWriter pw = null;
			// gzip test
			String headEncoding = req.getHeader("accept-encoding");
			if (headEncoding == null || (headEncoding.indexOf("gzip") == -1)) { // 客户端 不支持 gzip
				pw = resp.getWriter();
			} else { // 支持 gzip 压缩
				pw = new PrintWriter(new GZIPOutputStream(resp.getOutputStream()));
				resp.setHeader("content-encoding", "gzip");	
			}

			pw.write("<table>");
			pw.write("<tr><td>name:</td><td>" + name + "</td></tr>");
			pw.write("<tr><td>sex:</td><td>" + sex + "</td></tr>");
			pw.write("<tr><td>habits:</td><td>" + Arrays.toString(habits) + "</td></tr>");
			pw.write("</table>");
			pw.write("&gt;&lt;&and;");
			// 这里一定要关闭
			pw.close();
		}

      * 使用 工具类 的 servlet:

		protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
			PrintWriter pw = ServletGzipUtil.createGzipPw(req, resp);
			pw.write("<table>");
			pw.write("<tr><td>name:</td><td>" + name + "</td></tr>");
			pw.write("<tr><td>sex:</td><td>" + sex + "</td></tr>");
			pw.write("<tr><td>habits:</td><td>" + Arrays.toString(habits) + "</td></tr>");
			pw.write("</table>");
			pw.write("&gt;&lt;&and;");
			// 这里一定要关闭
			pw.close();
		}


------
分享到:
评论
1 楼 程序猿_星 2013-01-11  
为啥会中文乱码啊

相关推荐

    http请求吗,响应头,状态码

    如有必要,客户程序还可以选择发送其他的请求头。 1. Accept:浏览器可接受的MIME类型。 2. Accept-Charset:...Servlet能够向支持gzip的浏览器返回经gzip编码的HTML页面。许多情形下这可以减少5到10倍的下载时间。

    Spring整合Ecache

    它具有内存和磁盘存储,缓存加载器,缓存扩展,缓存异常处理程序,一个gzip缓存servlet过滤器,支持REST和SOAP api等特点。 优点: 1. 快速 2. 简单 3. 多种缓存策略 4. 缓存数据有两级:内存和磁盘,因此无需...

    五、读取HTTP请求头

    5.1 HTTP请求头概述 HTTP客户程序(例如浏览器),向服务器发送请求的时候必须指明请求类型(一般是GET或者POST)。如有必要,客户程序还可以...Servlet能够向支持gzip的浏览器返回经gzip编码的HTML页面。许多情形下这

    JAVA上百实例源码以及开源项目源代码

    5个目标文件,演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口...

    Java高并发高性能分布式框架从无到有微服务架构设计.doc

    它具有内存和磁盘存储,缓存加载器,缓存扩展,缓存异常处理程序,一 个gzip缓存servlet过滤器,支持REST和SOAP api等特点。MapDB: mapdb是一个内嵌的纯java的数据库,提供了并发的HashMap、TreeMap、Queue,可以基 于...

    JAVA上百实例源码以及开源项目

    5个目标文件,演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口...

    java源码包---java 源码 大量 实例

    5个目标文件,演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口...

    java源码包2

    5个目标文件,演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口...

    java源码包3

    5个目标文件,演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口...

    java源码包4

    5个目标文件,演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    5个目标文件,演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    5个目标文件,演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口...

Global site tag (gtag.js) - Google Analytics