extjs 2 + dwr 2 腳本加載速度優化

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章