servlet 以 gzip 格式返回数据

[b]servlet 以 gzip 格式 返回结果[/b]

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

------
[b]gzip 格式返回数据的 步骤:[/b]

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

------
[b]servlet gzip 工具类[/b]:

* 逻辑:
提供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;
}
}


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

------
[b]例子:[/b]

* 代码写在 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("><∧");
// 这里一定要关闭
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("><∧");
// 这里一定要关闭
pw.close();
}


------
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值