Directive 是所有指令的基类,Directive 是一个抽象类,它有三个方法必须实现的,分别是:
•getName:返回指令的名称
•getType:返回指令的类型,行指令:LINE、块指令:BLOCK
•render:指令执行的入口
其中 render 方法的最后一个参数 node 表示为该指定对应在 Velocity 模板中的节点对象,通过调用 node 的 jjtGetChild 方法可以获取到传递给该指令的参数以及包含在该指令的脚本内容。
上面的代码中,首先获取传递给指令的参数,也就是缓存的区域名和对应缓存数据的键值。接着判断距上次数据被缓存时,指令所包含的脚本代码是否有更改(以便页面开发人员修改了 vm 脚本时自动刷新缓存数据),然后判断缓存中是否已有数据。当缓存中无数据或者页面代码被修改时,重新执行块指令中的脚本并将执行的结果置入缓存,否则直接将缓存中的数据输出到页面。
上述例子中,传递给 #cache 指令的参数也可以是某个变量,例如
|
如此,便以很小的代码侵入,来实现页面的缓存。
自定义指令在 Veloeclipse 插件中的使用事项
Veloeclipse 是一个在 Eclipse 开发环境中编辑 Velocity 模板和 HTML 代码的插件,具有语法着色、自动代码完成以及错误提示等功能。如果在编辑 Velocity 模板时使用了自定义插件,则该插件会提示错误,我们可以通过下面的界面添加自定义的指令来使 Veloeclipse 支持这些指令。
点击菜单 Windows - Preferences - Veloeclipse ,通过如下的界面来添加自定义指令。
图 1. 添加自定义指令的界面
总结
Velocity 是一个非常高效、简洁的 Java 模板引擎,而且其强大的扩展性,使之特别适合在 Web 项目中使用。本文通过一个实际应用中的例子对 Velocity 的指令系统进行了介绍,欢迎大家跟我一起深入探讨 Velocity 的相关扩展问题。