<cache:cache>是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的日期格式。如:duration='PT5M' duration='5s'等。
refresh - false 或者true。如果refresh属性设置为true,不管其他的属性是否符合条件,这部分被缓存的内容都将被更新,这给编程者一种选择,决定什么时候必须刷新。
mode - 如果不希望被缓存的内容增加到给用户的响应中,可以设置mode属性为"silent"。此时被缓存的部分不在页面上显示,而其它任意的mode属性值都会将缓存的部分显示到页面上。
groups - 指定当前cache标签所属的组,可使用“,”分割组名。这样就可以对缓存项进行分组了。如果缓存项依赖于应用的其它部分或其它数据,分组就有了用武之地——当这种依赖改变时(刷新相关的组),这个组的所有缓存项都将过期。
language - 使用ISO-639定义的语言码来发布不同的缓存内容(under an otherwise identical key)。要在一个多语言网站上同一段JSP代码不同用户的参数提供不同的语言时,这个属性会很有用。
refreshpolicyclass - 指定自定义的刷新策略类的全限定类名。这个类继承自com.opensymphony.oscache.web.WebEntryRefreshPolicy
refreshpolicyparam - 指定任意需要传给refreshpolicyclass的参数。如果没有指定refreshpolicyclass,则这个值不起作用。其它可用的属性还包括:cron 、groups、language、refreshpolicyclass、refreshpolicyparam。
Cache标签实例分析
最简单的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>
使用标签的特殊说明
标签的属性值如果动态生成,则需要先把动态生成的值赋予一个变量,再使用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 >