为了提高访问portal的速度,引入了Cache ,在JSR-286规范里面有两种cache :
a.缓存Portlet数据 (比如EhCache)
注意,如果是要显示实时数据的Portlet不应该用data cache
b. 缓存Portlet内容 (缓存的是Portlet的内容而不是Portal页面的内容)
对于b,内容cache,有两种类型:
基于超时(expiration-based)和基于校验的(validation-based)内容cache.
(1) expiration-based 内容cache
实现方法<1>:在portlet.xml中如下配置 ,<expiration-cache>以秒作为单位
- <portlet>
- ...
- <expiration-cache>60</expiration-cache>
- <cache-scope>private</cache-scope>
- <supports>
- ...
- </supports>
- ...
- </portlet>
未超时的情况下,当portlet容器获得渲染portlet的请求时候,他不会调用render方法,而是直接返回cache里面的内容。如果超时了,则当获得渲染请求时候,他会立刻调用render方法。
<cache-scope>为public时候,这个cache的内容所有portal用户可见,为private时候,这个cache内容只有指定用户可见。
实现方法<2>:(可以覆盖<1>)
- public abstract interface CacheControl
- {
- public abstract int getExpirationTime();
- public abstract void setExpirationTime(int paramInt);
- public abstract boolean isPublicScope();
- public abstract void setPublicScope(boolean paramBoolean);
- public abstract String getETag();
- public abstract void setETag(String paramString);
- public abstract boolean useCachedContent();
- public abstract void setUseCachedContent(boolean paramBoolean);
- }
(2) validation-based 内容cache
它是expiration-based cache的补充,当cache超时时候,它会进行校验,如果portlet发现被cache的内容仍然合法,那么它会让portlet 容器继续使用cache中的内容持续cache设的时间,如果校验发现被cache的内容非法,则会产生新的内容。
每一个被cache的内容都有一个校验令牌(token),它被portlet设置并且存于portlet容器中。当超时发生时,可以用getETag取出来并且和原来的进行比较。
但是,很多Portlet容器并不支持validation-based cache,比如Liferay 就不支持。