1.缓存整个页面
在OSCache组件中提供了一个CacheFilter用于实现页面级的缓存。主要用于对web应用中的某些动态页面进行缓存,尤其是那些需要生成PDF格式文件/报表、图片文件等的页面,不仅减少了数据库的交互、减少数据库服务器的压力,而且对于减少web服务器的性能消耗有很显著的效果。
该功能是通过在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>600</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>
<!-对页面 main.jsp 进行缓存-->
<url-pattern>main.jsp</url-pattern>
<!-对所有jsp页面内容进行缓存
<url-pattern>*.jsp</url-pattern> -->
</filter-mapping>
备注:
1.在页面级缓存的情况下,可以通过设置CacheFilter的初始属性来决定缓存的一些特性:time属性设置缓存的时间段,默认为3600秒,可以根据自己的需要只有的设置,而scope属性设置,默认为application,可选项包括application、session。
2.只有客户访问时返回http头信息中代码为200(也就是访问已经成功)的页面信息才能够被缓存。
2.缓存局部页面
<%@ taglib uri="http://www.opensymphony.com/oscache" prefix="cache" %>
主要的标签有:
· cache标签- The main caching tag
· usecached标签- A nested tag to force using a cached version.
· flush标签- To flush caches programmatically.
· addgroup标签- It allows a single group name to be dynamically added to a cached block. This tag must be nested inside <cache:cache/>.
· addgroups标签- It allows a comma-delimited list of group names to be dynamically added to a cached block. This tag must be nested inside <cache:cache/>.
主要的标签有:
· cache标签- The main caching tag
· usecached标签- A nested tag to force using a cached version.
· flush标签- To flush caches programmatically.
· addgroup标签- It allows a single group name to be dynamically added to a cached block. This tag must be nested inside <cache:cache/>.
· addgroups标签- It allows a comma-delimited list of group names to be dynamically added to a cached block. This tag must be nested inside <cache:cache/>.
2.1 Cache标签-OSCache提供的缓存标签
这是OSCache提供的标签库中最重要的一个标签,包括在标签中的内容将应用缓存机制进行处理,处理的方式将取决于编程者对cache标签属性的设置。第一次请求到达时,标签中的内容被处理并且缓存起来,当下一个请求到达时,缓存系统会检查这部分内容的缓存是否已经失效,主要是以下几项:
1. 缓存时间超过了cache标签设置的time或者duration属性规定的超时时间 ,默认为一小时,指定时以s为单位。
2. 超过了cron属性规定的时间或日期
3. 通过flush标签,清除了指定的scope作用域的缓存。
4. 其他缓存超期设定
如果符合上面四项中的任何一项,被缓存的内容视为已经失效,这时被缓存的内容将被重新处理并且返回处理过后的信息,如果被缓存的内容没有失效,那么返回给用户的将是缓存中的信息。
cache标签的属性说明:
key- 标识缓存内容的关键词。在指定的作用范围内必须是唯一的。默认的key是被访问页面的URI和后面的请求字符串。
你可以在同一个页面中使用很多cache标签而不指定他的key属性,这种情况下系统使用该页面的URI和后面的请求字符串,另外再自动给这些key增加一个索引值来区分这些缓存内容。但是不推荐采用这样的方式。
这是OSCache提供的标签库中最重要的一个标签,包括在标签中的内容将应用缓存机制进行处理,处理的方式将取决于编程者对cache标签属性的设置。第一次请求到达时,标签中的内容被处理并且缓存起来,当下一个请求到达时,缓存系统会检查这部分内容的缓存是否已经失效,主要是以下几项:
1. 缓存时间超过了cache标签设置的time或者duration属性规定的超时时间 ,默认为一小时,指定时以s为单位。
2. 超过了cron属性规定的时间或日期
3. 通过flush标签,清除了指定的scope作用域的缓存。
4. 其他缓存超期设定
如果符合上面四项中的任何一项,被缓存的内容视为已经失效,这时被缓存的内容将被重新处理并且返回处理过后的信息,如果被缓存的内容没有失效,那么返回给用户的将是缓存中的信息。
cache标签的属性说明:
key- 标识缓存内容的关键词。在指定的作用范围内必须是唯一的。默认的key是被访问页面的URI和后面的请求字符串。
你可以在同一个页面中使用很多cache标签而不指定他的key属性,这种情况下系统使用该页面的URI和后面的请求字符串,另外再自动给这些key增加一个索引值来区分这些缓存内容。但是不推荐采用这样的方式。
scope - 缓存发生作用的范围,可以是application或者session.默认为application
time - 缓存内容的时间段,单位是秒,默认是3600秒,也就是一个小时,如果设定一个负值,那么这部分被缓存的内容将永远不过期。
duration - 指定缓存内容失效的时间,是相对time的另一个选择,即和time是二选一的,可以使用简单日期格式或者符合USO-8601的日期格式。如:duration='PT5M' duration='5s'等,也可以同门simple date format制定
refresh- false 或者true。如为true缓存将被刷新,不管缓存的内容是否过期。使你能决定是否重新缓存内容。
如果refresh属性设置为true,不管其他的属性是否符合条件,这部分被缓存的内容都将被更新,这给编程者一种选择,决定什么时候必须刷新。
mode - 如果编程者不希望被缓存的内容增加到给用户的响应中,可以设置mode属性为"silent"。如果把值设置为"silent",将防止标签体被写入到输出流。
refresh- false 或者true。如为true缓存将被刷新,不管缓存的内容是否过期。使你能决定是否重新缓存内容。
如果refresh属性设置为true,不管其他的属性是否符合条件,这部分被缓存的内容都将被更新,这给编程者一种选择,决定什么时候必须刷新。
mode - 如果编程者不希望被缓存的内容增加到给用户的响应中,可以设置mode属性为"silent"。如果把值设置为"silent",将防止标签体被写入到输出流。
cron:cron表达式确定缓存的内容什么时候过期,它允许缓存的内容在特殊的日期或时间过期,而不是当缓存的内容达到某个年龄。
介绍cron表达式:cron表达式的语法:
cron表达式由下面5个字段组成:
Minute:指定缓存的内容在小时的第几分钟过期,取值范围是0-59;
Hour:指定缓存的内容在一天的第几个小时将过期,这是指定使用24小时制,因此取值范围是:0(午夜)-23(上午11点)。
DOM:一个月的第几天。这是一个从1到31的数,它表示缓存的内容什么日子过期,如:在每月的10号过期,应该把值设为10。
Month:一年的第几月使内容过期,它可以通过数字1-12或者月的英文名字(eg 'January')指定。月的名称对大小写是不敏感的,只考虑前三个字符,其他部分忽略。
DOW:一周的第几天使缓存的内容过期,它可以是数字(0-6,0=星期天,6=星期六)或者是英文的星期名称。和月份一样大小写是不敏感的,只考虑前三个字符,其他部分忽略。
注意:当你不想给某个字段给定特定的值,你可以使用"*"代替。
OSCache的也允许你选择性地指定每个字段内的列表,范围和时间间隔(甚至是三者的结合)
List:集合中的列表项通过","分隔,缓存过期的时间和每个列表项匹配,例如:"0,15,30,45 * * * *",表示缓存中的内容每隔15分钟过期一次。
Ranges:使用"-"指定范围。一个范围将包括所有值从开始到结束值(包括起始值)例如: "* * * Jan-June *"表示一年的前六个月缓存将过期。 Intervals:一个间隔通过"/"指定。左边的“/”字符的值表示的出发点或范围值应递增超过,而右边的值表示间隔的时间长度。例如:"10/20 * * * *" 相当于 "10,30,50 * * * *", 而"10-45/20 * * * *" 只匹配过去每个小时的10-30分钟,因为50已经超过了范围。
介绍cron表达式:cron表达式的语法:
cron表达式由下面5个字段组成:
Minute:指定缓存的内容在小时的第几分钟过期,取值范围是0-59;
Hour:指定缓存的内容在一天的第几个小时将过期,这是指定使用24小时制,因此取值范围是:0(午夜)-23(上午11点)。
DOM:一个月的第几天。这是一个从1到31的数,它表示缓存的内容什么日子过期,如:在每月的10号过期,应该把值设为10。
Month:一年的第几月使内容过期,它可以通过数字1-12或者月的英文名字(eg 'January')指定。月的名称对大小写是不敏感的,只考虑前三个字符,其他部分忽略。
DOW:一周的第几天使缓存的内容过期,它可以是数字(0-6,0=星期天,6=星期六)或者是英文的星期名称。和月份一样大小写是不敏感的,只考虑前三个字符,其他部分忽略。
注意:当你不想给某个字段给定特定的值,你可以使用"*"代替。
OSCache的也允许你选择性地指定每个字段内的列表,范围和时间间隔(甚至是三者的结合)
List:集合中的列表项通过","分隔,缓存过期的时间和每个列表项匹配,例如:"0,15,30,45 * * * *",表示缓存中的内容每隔15分钟过期一次。
Ranges:使用"-"指定范围。一个范围将包括所有值从开始到结束值(包括起始值)例如: "* * * Jan-June *"表示一年的前六个月缓存将过期。 Intervals:一个间隔通过"/"指定。左边的“/”字符的值表示的出发点或范围值应递增超过,而右边的值表示间隔的时间长度。例如:"10/20 * * * *" 相当于 "10,30,50 * * * *", 而"10-45/20 * * * *" 只匹配过去每个小时的10-30分钟,因为50已经超过了范围。
groups:用逗号分隔组里面的名称,根据你的需要允许把缓存的条目分组。分组是非常有用的当你的缓存内容依赖应用或数据的其他部分,当这些依赖发生变化,flush相关的组将将导致所有缓存的条目在组中过期。
假设我们有一个类别的动态清单,我们从数据库中拉,我们也偶尔得到更新,通过调用一个WebService存储外币兑换利率。假设,我们也有一些
内容,显示有关类别和当前的汇率值的信息。下面缓存缓存主体内容的例子分配给2个缓存组 "currencyData"和"categoryList"。当汇率和类别
列表发生更新,相关的组将被flush因为这些内容(与任何其他与该组相关的内容)被过期了,然后当页面被访问的时候,再次建立缓存。
<cache:cache key="<%= product.getId() %>" time="-1" group="currencyData, categories">
... display category list ...
... display currency information ...
</cache:cache>
其它可用的属性还包括:cron 、groups、language、refreshpolicyclass、refreshpolicyparam。
上面的这些属性可以单独使用,也可以根据需要组合使用,下面的例子将讲解这些常用属性的使用方式。
假设我们有一个类别的动态清单,我们从数据库中拉,我们也偶尔得到更新,通过调用一个WebService存储外币兑换利率。假设,我们也有一些
内容,显示有关类别和当前的汇率值的信息。下面缓存缓存主体内容的例子分配给2个缓存组 "currencyData"和"categoryList"。当汇率和类别
列表发生更新,相关的组将被flush因为这些内容(与任何其他与该组相关的内容)被过期了,然后当页面被访问的时候,再次建立缓存。
<cache:cache key="<%= product.getId() %>" time="-1" group="currencyData, categories">
... display category list ...
... display currency information ...
</cache:cache>
其它可用的属性还包括:cron 、groups、language、refreshpolicyclass、refreshpolicyparam。
上面的这些属性可以单独使用,也可以根据需要组合使用,下面的例子将讲解这些常用属性的使用方式。
2.2,usecached标签
这个标签内嵌在一个<cache>标签中,表示<cache>标签是否使用cached version
属性:use:默认值为true,表示使用cached version,这是有用的对于编程式控制缓存。
例如:
This is a good example of error tolerance. If an exception occurs, the cached version of this content will be output instead.这是很好的容错例子,当异常发生缓存的内容将不会被输出。
<cache:cache>
<% try { %>
... some jsp content ...
<% } catch (Exception e) { %>
<cache:usecached />
<% } %>
</cache:cache>
例如:<cache:cache>
<%out.print(new Date()); %>
<cache:usecached use="true"/>
</cache:cache>
第一次访问的时候页面输出:Missing cached content ,如果接着把use改为false则会输出当前时间,当flush时,时间会改变。接着把use改为true,即使flush,时间也不会改变,它还会使用以前的缓存。
2.3,flush 标签
这个标签是用来在运行时刷新缓存。这是特别有用,因为它可以将您的网站的管理部分编码,以便管理员可以决定何时刷新缓存。
属性:
Scope:这决定哪些范围将被刷新。有效值是“application”,“session”和null。空范围将刷新所有缓存,不论其范围。默认为all。
Key:当同时指定了key和scope,表示一个缓存条目被标记为flush。当他下次被访问的时候缓存将被refresh。当仅指定了key而没有指定scope这是无效的。
group :指定一组将导致组中的所有缓存项被flush,如果仅仅指定group没有指定scope这是无效的。
2.4,addgroup 标签
属性:use:默认值为true,表示使用cached version,这是有用的对于编程式控制缓存。
例如:
This is a good example of error tolerance. If an exception occurs, the cached version of this content will be output instead.这是很好的容错例子,当异常发生缓存的内容将不会被输出。
<cache:cache>
<% try { %>
... some jsp content ...
<% } catch (Exception e) { %>
<cache:usecached />
<% } %>
</cache:cache>
例如:<cache:cache>
<%out.print(new Date()); %>
<cache:usecached use="true"/>
</cache:cache>
第一次访问的时候页面输出:Missing cached content ,如果接着把use改为false则会输出当前时间,当flush时,时间会改变。接着把use改为true,即使flush,时间也不会改变,它还会使用以前的缓存。
2.3,flush 标签
这个标签是用来在运行时刷新缓存。这是特别有用,因为它可以将您的网站的管理部分编码,以便管理员可以决定何时刷新缓存。
属性:
Scope:这决定哪些范围将被刷新。有效值是“application”,“session”和null。空范围将刷新所有缓存,不论其范围。默认为all。
Key:当同时指定了key和scope,表示一个缓存条目被标记为flush。当他下次被访问的时候缓存将被refresh。当仅指定了key而没有指定scope这是无效的。
group :指定一组将导致组中的所有缓存项被flush,如果仅仅指定group没有指定scope这是无效的。
2.4,addgroup 标签
这个标签必须内嵌在<cache:cache>标签内部,它允许一个组名,动态地添加到缓存的块中,
这将以key为test1的cache块增加到组group1和group2:
<cache:cache key="test1">
<cache:addgroup group="group1" />
... some jsp content ...
<cache:addgroup group="group2" />
... some more jsp content ...
</cache:cache>
2.5,addgroups标签
这将以key为test1的cache块增加到组group1和group2:
<cache:cache key="test1">
<cache:addgroup group="group1" />
... some jsp content ...
<cache:addgroup group="group2" />
... some more jsp content ...
</cache:cache>
2.5,addgroups标签
该标签 必须内嵌在<cache:cache>标签内部,
This will add the cache block with the key 'test1' to groups 'group1' and 'group2'.
<cache:cache key="test1">
... some jsp content ...
<cache:addgroups groups="group1,group2" />
... some jsp content ...
</cache:cache>
This will add the cache block with the key 'test1' to groups 'group1' and 'group2'.
<cache:cache key="test1">
... some jsp content ...
<cache:addgroups groups="group1,group2" />
... some jsp content ...
</cache:cache>
2.1.2 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代码内容
%>
5. 使用duration属性设置超期时间
<cache:cache duration='PT5M'>
<%
//自己的JSP代码内容
%>
6. 使用mode属性使被缓存的内容不加入给客户的响应中
<cache:cache mode='silent'>
<%
//自己的JSP代码内容
%>
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代码内容
%>
5. 使用duration属性设置超期时间
<cache:cache duration='PT5M'>
<%
//自己的JSP代码内容
%>
6. 使用mode属性使被缓存的内容不加入给客户的响应中
<cache:cache mode='silent'>
<%
//自己的JSP代码内容
%>
使用OScache标签,用标签把指定的内容给包含起来。在标签中可以设置缓存的属性。
用OSCache局部缓存,保存页面中的内容:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page language="java" import="java.util.*" %>
<%@ page language="java" import="java.text.*" %>
<%@ taglib uri="http://www.opensymphony.com/oscache" prefix="cache" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); %>
<div>
<cache:cache key="cacheDate" scope="session" time="15">
<h2>使用缓存,让时间在15秒内不进行更新</h2>
<div><%
String cacheTime = sdf.format(new Date());
out.println(cacheTime);
%>
</div>
</cache:cache>
</div>
<hr>
<div>
<h2>不使用缓存</h2>
<div><%
String commonTime = sdf.format(new Date());
out.println(commonTime);
%></div>
</div>
</body>
</html>
页面效果:
: