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>();