1、將通用的JS、CSS文件用GZIP壓縮。由於gzip.exe在壓縮多個文件時不方便,採用Java中的壓縮實現,代碼如下:
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.GZIPOutputStream;
public class GZip {
/**
* @param args
*/
public static void main(String[] args) {
compressFile("Web/common.js");
compressFile("Web/style.css");
System.out.println("ok");
}
private static void compressFile(String filePath) {
try {
// Create the GZIP output stream
String outFilename = filePath + ".fgz";
GZIPOutputStream out = new GZIPOutputStream(new FileOutputStream(
outFilename));
// Open the input file
String inFilename = filePath;
FileInputStream in = new FileInputStream(inFilename);
// Transfer bytes from the input file to the GZIP output stream
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
in.close();
// Complete the GZIP file
out.finish();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
2、使Tomcat支持.fgz格式,解析爲gzip。
AddHeaderFilter.java
package badqiu.web.filter;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
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;
/**
* @author badqiu([email protected])
*/
public class AddHeaderFilter implements Filter {
Map headers = new HashMap();
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
if(req instanceof HttpServletRequest) {
doFilter((HttpServletRequest)req, (HttpServletResponse)res, chain);
}else {
chain.doFilter(req, res);
}
}
public void doFilter(HttpServletRequest request,
HttpServletResponse response, FilterChain chain)
throws IOException, ServletException {
for(Iterator it = headers.entrySet().iterator();it.hasNext();) {
Map.Entry entry = (Map.Entry)it.next();
response.addHeader((String)entry.getKey(),(String)entry.getValue());
}
chain.doFilter(request, response);
}
public void init(FilterConfig config) throws ServletException {
String headersStr = config.getInitParameter("headers");
String[] headers = headersStr.split(",");
for(int i = 0; i < headers.length; i++) {
String[] temp = headers[i].split("=");
this.headers.put(temp[0].trim(), temp[1].trim());
}
}
}
web.xml片斷:
<filter>
<filter-name>AddHeaderFilter</filter-name>
<filter-class>
badqiu.web.filter.AddHeaderFilter
</filter-class>
<init-param>
<param-name>headers</param-name>
<param-value>Content-Encoding=gzip</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>AddHeaderFilter</filter-name>
<url-pattern>*.fgz</url-pattern>
</filter-mapping>
頁面片斷:<link rel="stylesheet" type="text/css" href="extjs/styles.css.fgz"/>
<script src="extjs/extjs-all.fgz" type="text/javascript"></script>
3、將 dwr/engine.js,dwr/util.js保存成靜態JS,並壓縮保存。如
<script type='text/javascript'
src='/[YOUR-WEB-APP]/dwr_js/engine.js.fgz'>
</script>
<script type='text/javascript'
src='/[YOUR-WEB-APP]/dwr_js/util.js.fgz'>
</script>
參考資料:
[1].Compressing a File in the GZIP Format.http://www.exampledepot.com/egs/java.util.zip/CompressFile.html
[2].關於JavaScript的gzip靜態壓縮方法.http://badqiu.iteye.com/blog/37176