這樣可以減少服務器解釋jsp代碼的次數.
1、編寫壹個實現 Filter 接口的類,這個類命名為 CacheFilter.java
2、修改web.xml添加Cache Filter的配置參數,將jsp的過濾類指向 CacheFilter 類。
3、在 CacheFilter 類中獲取請求,如果請求為需要緩存頁面,首先先判斷是否被緩存過,如果沒有被緩存過便將請求的頁面保存為靜態頁面文件。最後從文件中讀取靜態頁面並寫入請求的響應裏。重復本次操作進行其它頁面的緩存。
原理如上所訴,很簡單
為了方便,在實現中使用了網上的 jspbook 包,對包中的程序進行了修改,具體實現步驟如下:
1、下載 jspbook 包,地址: /onjava/2003/11/19/examples/jspbook.zip
2、解壓縮 jspbook 包,修改 CacheFilter 類 和 CacheResponseWrapper 類。
CacheFilter 類
69行:name = name.substring(0,name.lastIndexOf("/")==-1?0:name.lastIndexOf("/"));
改為:String filesp = System.getProperty("file.separator");
name = name.substring(0, name.lastIndexOf(filesp) == -1 ? 0 : name.lastIndexOf(filesp));//修改 獲得系統文件夾符號(源程序作者應該是外國人沒有考慮中文符號)
75行:wrappedResponse.flushBuffer();// 增加 強制刷新
CacheResponseWrapper 類
35行:stream.flush();
改為: writer.flush();
3、建立動態web項目,建立com.jspbook包,將修改好的jspbook包中的類加入該包下面
4、將jspbook包中的jsp文件拷入web目錄下
5、修改web.xml文件,下面是我寫的項目的配置文件,請重點看帶 filter 的標簽
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4" xmlns=" /xml/ns/j2ee" xmlns:xsi=" /xml/ns/j2ee /xml/ns/j2ee/web-app_2_4.xsd">
<display-name>
JSP2HTML</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<!-- The Cache Filter -->
<filter>
<!-- 設計過濾處理類,生成靜態頁面 -->
<filter-name>CacheFilter</filter-name>
<filter-class>com.jspbook.CacheFilter</filter-class>
<!-- 不需要緩存的URL -->
<init-param>
<param-name>/TimeMonger.jsp</param-name>
<param-value>nocache</param-value>
</init-param>
<init-param>
<param-name>/TestCache.jsp</param-name>
<param-value>nocache</param-value>
</init-param>
<!-- 緩存超時時間, 單位為秒 -->
<init-param>
<param-name>cacheTimeout</param-name>
<param-value>600</param-value>
</init-param> <!-- 是否根據瀏覽器不同的地區設置進行緩存(生成的緩存文件為 test.jspid=1_zh_CN 的格式) -->
<init-param>
<param-name>locale-sensitive</param-name>
<param-value>true</param-value>
</init-param> </filter> <!-- 設置需要緩存的 URL, 可以使用通配符, 如 /*.jsp, 或者加入多個映射地址 -->
<!--
<filter-mapping>
<filter-name>CacheFilter</filter-name>
<url-pattern>/news.jsp</url-pattern>
</filter-mapping>
-->
<filter-mapping>
<filter-name>CacheFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
</web-app>6、配置web環境,運行web應用,妳會發現由於 TestCache.jsp 和 TimeMonger.jsp 被配置成為 nocache 所以每次都回被重新加載。
<init-param>
<param-name>/TimeMonger.jsp</param-name>
<param-value>nocache</param-value>
</init-param>
其它的jsp頁面會被保存成為靜態文件,然後將靜態文件返回給請求的響應。
<filter-mapping>
<filter-name>CacheFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
具體的緩存保存路徑,請查找 CacheFilter 類 中53行的 String temp = tempDir.getAbsolutePath();
以上代碼已經執行通過,如有問題請留言