OSCache - 緩存標籤

是OSCache提供的標籤庫中最重要的一個標籤,包括在標籤中的內容將應用緩存機制進行處理,處理的方式將取決於編程者對cache標籤屬性的設置。

第一次請求到達時,標籤中的內容被處理並且緩存起來,當下一個請求到達時,緩存系統會檢查這部分內容的緩存是否已經失效,主要是以下幾項:
1. 緩存時間超過了cache標籤設置的time或者duration屬性規定的超時時間;
2. cron屬性規定的時間比緩存信息的開始時間更晚;
3. 標籤中緩存的內容在緩存後又被重新刷新過;
4. 其他緩存超期設定

如果符合上面四項中的任何一項,被緩存的內容視爲已經失效,這時被緩存的內容將被重新處理並且返回處理過後的信息,如果被緩存的內容沒有失效,那麼返回給用戶的將是緩存中的信息。

[color=blue][b]cache標籤的屬性說明[/b][/color]
(這些屬性可以單獨使用,也可以根據需要組合使用)
[b]key[/b] - 標識緩存內容的關鍵詞。在指定的作用範圍內必須是唯一的。默認的key是被訪問頁面的URI和後面的請求字符串。你可以在同一個頁面中使用很多cache標籤而不指定他的key屬性,這種情況下系統使用該頁面的URI和後面的請求字符串,另外再自動給這些key增加一個索引值來區分這些緩存內容。但是不推薦採用這樣的方式。

[b]scope[/b] - 緩存發生作用的範圍,可以是application或者session。

[b]time[/b] - 緩存內容的時間段,單位是秒,默認是3600秒,也就是一個小時,如果設定一個負值,那麼這部分被緩存的內容將永遠不過期。

[b]duration[/b] - 指定緩存內容失效的時間,是相對time的另一個選擇,可以使用簡單日期格式或者符合USO-8601的日期格式。如:duration='PT5M' duration='5s'等。

[b]refresh[/b] - false 或者true。如果refresh屬性設置爲true,不管其他的屬性是否符合條件,這部分被緩存的內容都將被更新,這給編程者一種選擇,決定什麼時候必須刷新。

[b]mode[/b] - 如果不希望被緩存的內容增加到給用戶的響應中,可以設置mode屬性爲"silent"。此時被緩存的部分不在頁面上顯示,而其它任意的mode屬性值都會將緩存的部分顯示到頁面上。

[b]groups[/b] - 指定當前cache標籤所屬的組,可使用“,”分割組名。這樣就可以對緩存項進行分組了。如果緩存項依賴於應用的其它部分或其它數據,分組就有了用武之地——當這種依賴改變時(刷新相關的組),這個組的所有緩存項都將過期。

[b]language[/b] - 使用ISO-639定義的語言碼來發布不同的緩存內容(under an otherwise identical key)。要在一個多語言網站上同一段JSP代碼不同用戶的參數提供不同的語言時,這個屬性會很有用。

[b]refreshpolicyclass[/b] - 指定自定義的刷新策略類的全限定類名。這個類繼承自com.opensymphony.oscache.web.WebEntryRefreshPolicy

[b]refreshpolicyparam[/b] - 指定任意需要傳給refreshpolicyclass的參數。如果沒有指定refreshpolicyclass,則這個值不起作用。其它可用的屬性還包括:cron 、groups、language、refreshpolicyclass、refreshpolicyparam。


[b][color=darkblue]Cache標籤實例分析[/color][/b]
最簡單的cache標籤用法。使用默認的關鍵字來標識cache內容,超時時間是默認的3600秒。

<oscache:cache>
<% //自己的JSP代碼內容%>
</oscache:cache>


設置time屬性爲負數使緩存內容永不過期

<oscache:cache time="-1">
<% //自己的JSP代碼內容 %>
</oscache:cache>


使用duration屬性設置超期時間


使用mode屬性使被緩存的內容不加入給客戶的響應中

<oscache:cache mode='silent'>
<% //自己的JSP代碼內容 %>
</oscache:cache>


用自己指定的字符串標識緩存內容,並且設定作用範圍爲session。

<oscache:cache key="foobar" scope="session">
<% //自己的JSP代碼內容%>
</oscache:cache>


動態設定key值,使用自己指定的time屬性設定緩存內容的超時時間,使用動態refresh值決定是否強制內容刷新。因爲OSCache使用key值來標識緩存內容,使用相同的key值將會被認爲使用相同的的緩存內容,所以使用動態的key值可以自由的根據不同的角色、不同的要求決定使用不同的緩存內容。

<oscache:cache key="<%= product.getId() %>" time="1800" refresh="<%= needRefresh %>">
<% //自己的JSP代碼內容%>
</oscache:cache>



flush標籤:這個標籤用於在運行時刷新緩存。只有運行flush標籤後再次訪問相關緩存項時才執行刷新。

<oscache:flush key="cacheKey" scope="application" />


usecached標籤:必須嵌套在<cache>標籤中。告訴所在的<cache>標籤是否使用已經緩存的內容(缺省爲true,使用緩存的內容)。可以使用這個標籤來控制緩存。比如使用<frush>標籤刷新某個key的緩存,但可以在必要的地方即使這樣的強制刷新也仍然使用緩存內容而不刷新。

<oscache:cache>
<% try { %>
... some jsp content ...
<% } catch (Exception e) { %>
<cache:usecached />
<% } %>
</oscache:cache>


[b][color=darkblue]使用標籤的特殊說明[/color][/b]
標籤的屬性值如果動態生成,則需要先把動態生成的值賦予一個變量,再使用JSP 表達式把動態值賦予對應的屬性。

<!--正確的寫法:-->
<%
String keyValue =
(String)request.getAttribute("keyValue");
if(keyValue == null)
keyValue = "";
%>
<oscache:cache refresh='<%=keyValue%>'>
......
</oscache:cache >



<!--不正確的寫法:-->
<oscache:cache refresh=
'<%=(String)request.getAttribute("keyValue")%>'>
......
</oscache:cache >

屬性的值此時爲字符串:"<%=(String)request.getAttribute("keyValue")%>"

標籤的屬性值對boolean是強類型的,比如cache的refresh屬性要求爲true或false,示例如下:

<!--不正確的寫法:-->
<!--正確的寫法:-->
<oscache:cache refresh="true">
......
</oscache:cache >
<!--正確的寫法:-->
<% String needRefresh =
(String)application.getAttribute("needRefresh");
if(needRefresh == null) needRefresh = "false";
boolean boo =
Boolean.valueOf(needRefresh).booleanValue(); %>
<oscache:cache refresh='<%=boo %>'>
......
</oscache:cache >



<!--不正確的寫法:-->
<oscache:cache refresh='<%= needRefresh %>'>
......
</oscache:cache >
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章