JAVAWEB文章索引点这里
模拟输出一些字符,使用装饰者设计模式重写response对象的PrintWriter对象。然后在过滤器中兑内容进行一个压缩输出。
servlet内容
package com.servlet;
import java.io.IOException;
import java.util.zip.GZIPOutputStream;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.tomcat.util.http.fileupload.ByteArrayOutputStream;
@WebServlet("/GZIPServlet")
public class GZIPServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
StringBuffer sb = new StringBuffer();
for(int i = 0; i < 1000; i++) {
sb.append("str");
}
System.out.println("压缩前的大小:"+sb.toString().length());
response.getWriter().write(sb.toString());
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
filter的内容
package com.filter;
import java.io.CharArrayWriter;
import java.io.IOException;
import java.io.PrintWriter;
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.annotation.WebFilter;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
import org.apache.tomcat.util.http.fileupload.ByteArrayOutputStream;
@WebFilter("/GZIPServlet")
public class GZIPFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletResponse response2 = (HttpServletResponse)response;
MyResponse myResponse = new MyResponse(response2);
//传递自己写的response对象
chain.doFilter(request, myResponse);
ByteArrayOutputStream buf = new ByteArrayOutputStream();
//将buf作为容器放入GZIPOutputStream
GZIPOutputStream gzip = new GZIPOutputStream(buf);
//将charArray中的内容进行压缩,写入buf
gzip.write(new String(myResponse.getCharArray()).getBytes());
//结束命令,刷新完缓冲区
gzip.finish();
byte[] result = buf.toByteArray();
//告诉浏览器发出的内容为gzip压缩过的内容
myResponse.setHeader("content-encoding", "gzip");
System.out.println("压缩后大小为:"+result.length);
response.getOutputStream().write(result);
}
public void init(FilterConfig fConfig) throws ServletException {
}
}
/**
* 用装饰者模式重写PrintWriter方法
* */
class MyResponse extends HttpServletResponseWrapper{
private CharArrayWriter charArray = new CharArrayWriter();
public MyResponse(HttpServletResponse response) {
super(response);
}
public char[] getCharArray() {
return charArray.toCharArray();
}
@Override
public PrintWriter getWriter() throws IOException {
//当调用response.getWriter的时候,写入的内容会写到charArray
return new PrintWriter(charArray);
}
}