為什麼要jsp頁面靜態化。
所謂jsp頁面靜態化就是指將動態jsp頁面產生靜態html頁面,通過直接存取產生的html來擷取和訪問jsp相同的展現內容和應用功能。
jsp或者說動態網頁面技術的出現就是為瞭解決靜態html的不足(無法動態擷取資料),那麼為什麼現在又要反過來去做頁面靜態化的工作呢。主要是因為頁面靜態化能夠帶來兩個主要的好處:一是訪問效能的提高,二是後台資料庫壓力的降低。
jsp是通過jsp解析引擎將其轉換為文檔流之後返回給最終的瀏覽器用戶端的,所以如果已經將其產生為了html,這樣訪問的時候就節省了jsp引擎的解析工作,自然訪問效能就好了,特別在伺服器壓力較大的情況下二者的效能差距顯著。另外一般jsp頁面上都會需要從後台讀取資料,預先將其靜態化就少去了每次訪問都要去查詢資料庫的步驟,自然資料庫的壓力也會降低。
哪些頁面靜態化。
並不是所有的jsp頁面都適合靜態化,靜態化犧牲了動態即時擷取資料的能力,所以對於那些需要即時擷取資料庫資料的頁面是不適合靜態化的。靜態化最常見的例子就是新聞,因為發布過後基本上就不會修改了,所以這類內容型的頁面最應當進行頁面靜態化。實際上這類內容一般都是通過各種CMS來做,也不需要程式員自己去搞了。
freemaker和頁面靜態化
freemaker和頁面靜態化其實沒啥必然聯絡了,充其量是一種解決方案。它在本質上和JSP類似,都是由相關引擎對模版進行解析產生最終的文檔內容。
靜態化技術
對於jsp頁面的靜態化這裡介紹一種簡單的方法,httpclient+urlrewrite,特別是針對既有的jsp應用進行靜態化實施起來比較簡單。
使用httpclient產生靜態html
import java.io.File;import java.io.FileWriter;import org.apache.commons.httpclient.HttpClient;import org.apache.commons.httpclient.methods.GetMethod;public class TestHttpClient {public static void main(String[] args) {HttpClient client = new HttpClient();GetMethod getMethod = new GetMethod("http://192.10.110.88:8080/test/index.jsp");String path=TestHttpClient.class.getClassLoader().getResource("").getPath();path=path.substring(0,path.indexOf("WEB-INF/classes/"))+"static/";try {client.executeMethod(getMethod);File file = new File(path+"index.html");//存到應用的static目錄下FileWriter writer = new FileWriter(file);writer.write(getMethod.getResponseBodyAsString());writer.flush();} catch (Exception e) {e.printStackTrace();} }}
urlrewrite的作用。
使用urlrewrite可以進行url的重新導向,這對於對既有jsp應用的靜態化來說非常好,因為只需要配置一下就可以使得訪問動態jsp頁面請求重新定向到對產生的html進行訪問,基本上不需要改動原來的代碼。基本上就兩個步驟:
1)下載urlrewritefilter-4.0.3.jar 放到WEB-INF/lib下面
2)對WEB-INF/web.xml添加一個過濾器,注意:如果你還定義了其他的filter,建議將該filter放在最前面。
<filter> <filter-name>UrlRewriteFilter</filter-name> <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class></filter><filter-mapping> <filter-name>UrlRewriteFilter</filter-name> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher></filter-mapping>
詳細配置可以參考 http://tuckey.org/urlrewrite/
帶ajax頁面的靜態化 現在ajax技術已經被非常廣泛的使用,針對含有ajax的jsp頁面實施靜態化的話會麻煩多多。 htmlunit這個工具倒是可以類比進行ajax請求,但是仍然會有很多的問題。最常見的,使用jquery的時候常常在頁面載入完成後執行ajax請求,這種情況下即便靜態化產生了html,對html訪問時仍然會再次發送ajax請求,這樣頁面靜態化的作用就大打折扣了。有人提出可以使用jsoup等解析文檔,去除不需要再執行的指令碼,現實情況是這很難,就拿使用jquery來說,常見的情況是頁面載入完成後除了發送ajax請求還會為dom元素註冊監聽事件等等,如果去除了指令碼,那頁面的功能就不正常了。所以如果必需要對含有ajax請求的jsp進行靜態化,最划算的方法是改寫或重寫原有功能介面,將頁面初始化後自動執行的ajax請求去除,改為相關資料一次性返回。