background image

velocity.properties 文件中定义的,例如:userdirective=net.oschina.toolbox.CacheDirective。如

 

 

果是多个自定义指令则使用 逗号隔开。

 

所有的自定义指令要求扩展 org.apache.velocity.runtime.directive.Directive 这个类。为了

 

更加形象直观的表现 Velocity 自定义指令的优点,接下来我们将以一个实际的应用场景

 

进行讲解。

 

 

在 该应用场景中,所有的页面请求直接指向 vm 文件,中间没经过任何的控制器。数

 

据是通过 Velocity   

的 toolbox 直接读取并显示在页面上。如果数据是来自数据库的,而且

访问量非常大的时候,我们就需要对这些数据进行缓存以便快速响应用户请求和降低系

 

 

统负载。一种方法 是直接在 toolbox 的读取数据的方法中进行数据的缓存;另外一种就是

 

我们接下来要介绍的,通过编写自定义的缓存指令来缓存页面上的某个 HTML 片段。
 首先我们定义一个这样的块指令:#cache( “ CacheRegion ” , ” Key ” ) ,其中第一个参数
为缓存区域、第二个参数为对应缓存数据的键值。该指令自动将包含在指令内部的脚本执

 

 

行后的结构缓存起来,当第一次请求时检查缓存中是否存 在此 HTML 片段数据,如果存
在就直接输出到页面,否则执行块指令中的脚本,执行后的结果输出到页面同时保存到

 

缓存中以便下次使用。使用方法如下所示:

#cache("News","home") 
  ## 读取数据库中最新新闻并显示
  <ul> 
  #foreach($news in $NewsTool.ListTopNews(10)) 
     <li> 
      <span class='date'> 
 $date.format("yyyy-MM-dd",${news.pub_time}) 
 </span> 
      <span class='title'>${news.title}</span> 
     </li> 
  #end 
  </ul> 
 #end

 

 

其中 $NewsTool.ListTopNews(10) 

 

是用来从数据库中读取最新发布的 10 

 

条新闻信息。

 

接下来我们来看 #cache 这个指令对应的源码:

/**
 * Velocity 模板上用于控制缓存的指令
 * @author Winter Lau
 * @date 2009-3-16 下午 04:40:19
 */

public class CacheDirective extends Directive {

        final   static   Hashtable<String,String>   body_tpls   =   new   Hashtable<String, 

String>();