1 以下是在某個servlet中對指定的數據進行壓縮:
package cn.hongxing.servlet;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PRintWriter;
import java.io.StringReader;
import java.util.zip.GZIPOutputStream;
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 resp)
throws ServletException, IOException {
//聲明準備被壓縮的數據
String str = "Hello你好Hello你好在內存中聲明一Hello你好在" +
"內存中聲明一個Hello你好在內存中聲明一個Hello你" +
"好在內存中聲明一個<br/>容器聲明準備被壓縮獲取準備被壓縮" +
"的數據的字節碼的數據容器聲明準備被壓縮獲取準備被壓縮的數" +
"據的字節碼的數據容器聲明準備被壓縮獲取準備被壓縮的數據的" +
"字節碼的數據個容器聲明準備被壓縮獲取準備被壓縮的數據的字節碼的" +
"數據在內存中聲明一個容器聲明準備被壓縮獲取準備被壓縮的數據" +
"的字節碼的數據";
//2:獲取準備被壓縮的數據的字節碼
byte[] src = str.getBytes("UTF-8");
//3:在內存中聲明一個容器
ByteArrayOutputStream destByte = new ByteArrayOutputStream();
//4:聲明壓縮的工具流,并設置壓縮的目的地為destByte
GZIPOutputStream zip = new GZIPOutputStream(destByte);
//5:寫入數據
zip.write(src);
//6:關閉壓縮工具流
zip.close();
System.err.println("壓縮之前字節碼大小:"+src.length);
//7:獲取壓縮以后數據
byte[] dest = destByte.toByteArray();
System.err.println("壓縮以后的字節碼大小:"+dest.length);
//8:必須要輸出壓縮以后字節數組
resp.setContentType("text/html;charset=UTF-8");
//9:必須要使用字節流來輸出信息
OutputStream out = resp.getOutputStream();
//10:通知瀏覽器。這是壓縮的數據,要求瀏覽器解壓
resp.setHeader("Content-encoding","gzip");
//11:通知瀏覽器壓縮數據的長度
resp.setContentLength(dest.length);
//10:輸出
out.write(dest);
}
}
2:所有頁面*。jsp全部壓縮只要是輸出信息,只有兩種方式:
Respoonse.getWriter()..[W1]輸出信息 - 字符流。所有的jsp頁面,編譯后,都是通過JspWriter方式輸出的信息。
但所有jsp頁面都是JspWriter,而jspwriter是對PrintWriter的包裝。
Response.getOutputStream() – ―― 字節流。
分析:如果要實現全站的壓縮,請先實現對所有servlet中的resp.getWriter輸出的數據都壓縮
先實現對一個進行壓縮。
第一步:書寫一個類Servlet類。正常輸出信息: resp.,getWriter().print(…..);
public class OneServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("Hello你好大家同學");
}
}
第二步:對這上面的這個類進行攔截-Filter,在攔截過程中包裝response實現抽像類:HttpServletResponseWrapper - package cn.hongxin.filter;
import java.io.IOException;
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.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
public class GzipFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
}
public void doFilter(ServletRequest request, ServletResponseresponse,
FilterChain chain) throws IOException, ServletException{
//聲明MyResponse包裝類
MyResponseresp = new MyResponse((HttpServletResponse) response);
//放行時,必須要傳遞自己包裝過的類
chain.doFilter(request, resp);
}
public void destroy() {
}
}
//實現對HttpSerlvetResponse的包裝
class MyResponse extendsHttpServletResponseWrapper{
public MyResponse(HttpServletResponse response) {
super(response);
}
}
第三步:為了可以壓縮數據,我們必須要攔截getwriter方法返回的不是apache的Wrtiter對象。
以下是完整的代碼:
package cn.hongxing.filter;
public class GzipFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
}
public void doFilter(ServletRequest request, ServletResponseresponse,
FilterChain chain) throws IOException, ServletException{
//聲明MyResponse包裝類
MyResponseresp = new MyResponse((HttpServletResponse) response);
//放行時,必須要傳遞自己包裝過的類
chain.doFilter(request,resp);
//目標類調用完成了,返回 以后讀取a.txt
Filefile = new File("d:/a/a.txt");
//聲明一個緩存的字符串對象
StringBuildersb = new StringBuilder();
//讀取文件
InputStreamin = new FileInputStream(file);
byte[] b = new byte[1024];
int len = 0;
while((len=in.read(b))!=-1){
sb.append(new String(b,0,len,"UTF-8"));
}
in.close();
//轉成字節開始壓縮
byte[] src = sb.toString().getBytes("UTF-8");
//聲明緩存容器
ByteArrayOutputStreamdestBytes = new ByteArrayOutputStream();
//聲明壓縮流
GZIPOutputStreamgzip = new GZIPOutputStream(destBytes);
//壓縮數據
gzip.write(src);
gzip.close();
//獲取壓縮以后數據
byte[] dest =destBytes.toByteArray();
System.err.println("壓縮之前:"+src.length);
System.err.println("壓縮以后:"+dest.length);
//輸出
//必須要使用原生 的response
HttpServletResponseres = (HttpServletResponse) response;
res.setContentType("text/html;charset=UTf-8");
OutputStreamout = res.getOutputStream();
res.setHeader("Content-encoding", "gzip");//必須
res.setContentLength(dest.length);
out.write(dest);
}
public void destroy() {
}
}
//實現對HttpSerlvetResponse的包裝
class MyResponse extendsHttpServletResponseWrapper{
public MyResponse(HttpServletResponse response) {
super(response);
}
@Override
public PrintWriter getWriter() throws IOException {
System.err.println("有人想獲取輸出流");
PrintWriter out = new PrintWriter(
new OutputStreamWriter(
new FileOutputStream("d:/a/a.txt"),"UTF-8"));
return out;
}
}
第四步看下一篇
新聞熱點
疑難解答