为了提高访问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>以秒作为单位

  1. <portlet> 
  2. ... 
  3. <expiration-cache>60</expiration-cache> 
  4. <cache-scope>private</cache-scope> 
  5. <supports> 
  6. ... 
  7. </supports> 
  8. ... 
  9. </portlet> 

未超时的情况下,当portlet容器获得渲染portlet的请求时候,他不会调用render方法,而是直接返回cache里面的内容。如果超时了,则当获得渲染请求时候,他会立刻调用render方法。

<cache-scope>为public时候,这个cache的内容所有portal用户可见,为private时候,这个cache内容只有指定用户可见。

实现方法<2>:(可以覆盖<1>)

  1. public abstract interface CacheControl 
  2.   public abstract int getExpirationTime(); 
  3.  
  4.   public abstract void setExpirationTime(int paramInt); 
  5.  
  6.   public abstract boolean isPublicScope(); 
  7.  
  8.   public abstract void setPublicScope(boolean paramBoolean); 
  9.  
  10.   public abstract String getETag(); 
  11.  
  12.   public abstract void setETag(String paramString); 
  13.  
  14.   public abstract boolean useCachedContent(); 
  15.  
  16.   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 就不支持。