在 Velocity
模板语言的语法中,以美元符 $
开头的为变量的声明或者引用,而以井号 #
开头的语句则为 Velocity 的指令(Directive
)。其中 Velocity 的指令又分为内置指令、自定
义宏和自定义指令。 Velocity
包含下列这些内置指令:
另外也可以通过宏来扩展指令,例如,请看下面这个宏的定义:
#macro(invoke $__p_page)
#if($__p_page.startsWith("/"))
#parse($__p_page)
#else
#set($__uri = $resource.this_vm())
#set($__path = $__uri.substring(0, $__uri.lastIndexOf("/")))
#parse("$__path/$__p_page")
#end
#end
上 面这个名为 invoke 的宏的作用是以相对路径的方式嵌入某个动态的页面。使用的
方法是 #invoke( “ hello.vm ” )
。尽管 Velocity 的自定义宏可以用来扩展指令,但是宏有一
个不足的地方,它更适合用来执行一些比较通用的代码嵌入和简单的功能处理。
由此引出来的问题是,我如何来编写一个类似于 #foreach 的指令呢,并具有逻辑判
断的功能?
Velocity 的指令类型简介
在 Velocity 的指令定义上,有两种指令类型分别是行指令和块指令。行指令例如
#set($name= ” Winter Lau ” ) 赋值指令,只有一行,中间没有任何的代码;而块指令例如
循环指令 #foreach($idx in [1..20]) $idx #end
,块指令需要用 #end
来结束。在 Velocity 自带
的指令中块指令包括有:#if #elseif #foreach #define
和 #macro 这几个指令,除此之外都是
行指令。
编写自定义的 Velocity 指令
Velocity
允许您对指令系统进行扩展,在 Velocity 引擎初始化的时候会加载系统内置
指 令 和 用 户 的 自 定 义 指 令 。 系 统 的 内 置 指 令 已 经 在 Velocity
的 Jar 包 中 的
directive.properties 文件中定义,不建议直接修改该文件。而自定义的指令要求用户在