一、OSCache提供的緩存標簽
這是OSCache提供的標簽庫中最重要的一個標簽,包括在標簽中的內容將應用緩存機制進行處理,處理的方式將取決於編程者對cache標簽屬性的設置。
第一次請求到達時,標簽中的內容被處理並且緩存起來,當下一個請求到達時,緩存系統會檢查這部分內容的緩存是否已經失效,主要是以下幾項:
1. 緩存時間超過了cache標簽設置的time或者duration屬性規定的超時時間;
2. cron屬性規定的時間比緩存信息的開始時間更晚;
3. 標簽中緩存的內容在緩存后又被重新刷新過;
4. 其他緩存超期設定。
如果符合上面四項中的任何一項,被緩存的內容視為已經失效,這時被緩存的內容將被重新處理並且返回處理過后的信息,如果被緩存的內容沒有失效,那么返回給用戶的將是緩存中的信息。
cache標簽的屬性說明:
key - 標識緩存內容的關鍵詞。在指定的作用范圍內必須是唯一的。默認的key是被訪問頁面的URI和后面的請求字符串。
你可以在同一個頁面中使用很多cache標簽而不指定他的key屬性,這種情況下系統使用該頁面的URI和后面的請求字符串,另外再自動給這些key增加一個索引值來區分這些緩存內容。但是不推薦采用這樣的方式。
scope - 緩存發生作用的范圍,可以是application或者session。
time - 緩存內容的時間段,單位是秒,默認是3600秒,也就是一個小時,如果設定一個負值,那么這部分被緩存的內容將永遠不過期。
duration - 指定緩存內容失效的時間,是相對time的另一個選擇,可以使用簡單日期格式或者符合USO-8601的日期格式。
refresh - false 或者true。
如果refresh屬性設置為true,不管其他的屬性是否符合條件,這部分被緩存的內容都將被更新,這給編程者一種選擇,決定什么時候必須刷新。
mode - 如果編程者不希望被緩存的內容增加到給用戶的響應中,可以設置mode屬性為"silent"。
其它可用的屬性還包括:cron 、groups、language、refreshpolicyclass、refreshpolicyparam。
上面的這些屬性可以單獨使用,也可以根據需要組合使用,下面的例子將講解這些常用屬性的使用方式。
二、Cache標簽實例分析
1. 最簡單的cache標簽用法
使用默認的關鍵字來標識cache內容,超時時間是默認的3600秒
<cache:cache>
<% //自己的JSP代碼內容 %>
</cache:cache>
2. 用自己指定的字符串標識緩存內容,並且設定作用范圍為session。
<cache:cache key="foobar" scope="session">
<% //自己的JSP代碼內容 %>
</cache:cache>
3.動態設定key值,使用自己指定的time屬性設定緩存內容的超時時間,使用動態refresh值決定是否強制內容刷新。
因為OSCache使用key值來標識緩存內容,使用相同的key值將會被認為使用相同的的緩存內容,所以使用動態的key值可以自由的根據不同的角色、不同的要求決定使用不同的緩存內容。
<cache:cache key="<%= product.getId() %>" time="1800" refresh="<%= needRefresh %>">
<% //自己的JSP代碼內容 %>
</cache:cache>
4. 設置time屬性為負數使緩存內容永不過期
<cache:cache time="-1">
<% //自己的JSP代碼內容 %>
</cache:cache>
5. 使用duration屬性設置超期時間
<cache:cache duration=''PT5M''>
<% //自己的JSP代碼內容 %>
</cache:cache>
6. 使用mode屬性使被緩存的內容不加入給客戶的響應中
<cache:cache mode=''silent''>
<% //自己的JSP代碼內容 %>
</cache:cache>
案例一
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@page import="java.text.SimpleDateFormat"%> <%@ taglib uri="http://www.opensymphony.com/oscache" prefix="cache"%> <html> <body> 沒有緩存的日期: <%=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())%><p> <!--自動刷新--> <cache:cache time="30"> 每30秒刷新緩存一次的日期: <%=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())%><p> </cache:cache> <!--手動刷新--> <cache:cache key="testcache"> 手動刷新緩存的日期: <%=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())%><p> </cache:cache> <a href="cache2.jsp">手動刷新</a> </body> </html>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib uri="http://www.opensymphony.com/oscache" prefix="cache"%> <html> <body> 緩存已刷新... <cache:flush key="testcache" scope="application" /> <a href="cache1.jsp">返回</a> </body> </html>
三、緩存過濾器 CacheFilter
你可以在web.xml中定義緩存過濾器,定義特定資源的緩存。
<filter> <filter-name>CacheFilter</filter-name> <filter-class>com.opensymphony.oscache.web.filter.CacheFilter</filter-class> <init-param> <param-name>time</param-name> <param-value>60</param-value> </init-param> <init-param> <param-name>scope</param-name> <param-value>session</param-value> </init-param> </filter> <filter-mapping> <filter-name>CacheFilter</filter-name> <url-pattern>*.jsp</url-pattern> </filter-mapping>
上面定義將緩存所有.jsp頁面,緩存刷新時間為60秒,緩存作用域為Session
注意,CacheFilter只捕獲Http頭為200的頁面請求,即只對無錯誤請求作緩存,而不對其他請求(如500,404,400)作緩存處理。