Velocity 语法概要
在Velocity中所有的关键字都是以 # 开头的,而所有的变量则是以 $ 开头。下面是具体的语法规则。
注释
- 单行注释
## 这是单行注释 ## $department.departmentName
- 多行注释
#* 这是多行注释 *# #* $department.departmentName *#
- 文档格式注释
#** 这是文档格式注释 **# #** $department.departmentName **#
变量
在Velocity中也有变量的概念,使用 $ 符声明变量,可以声明变量也可以对变量进行赋值(变量是弱类型的)。另外还可以使用$取出在VelocityContext容器中存放的值
#set(${!name} = "velocity")
#set(${!foo} = $bar)
#set($foo ="hello")
#set($foo.name = $bar.name)
#set($foo.name = $bar.getName($arg))
#set($foo = 123)
#set($foo = ["foo",$bar])
注意变量定义语句为#set($),上面代码中 ! 的 写 法 , 使 用 !{}的写法,使用 !的写法,使用vari获取变量时,如果变量不存在,Velocity引擎会将其原样输出,通过使用$!{}的形式可以将不存在的变量变成空白输出.
循环
在Velocity中可以使用循环语法遍历集合,语法结构如下:
#*
循环
$list:遍历的集合
$item:集合中的每个项
$velocityCount:集合索引
*#
#foreach($item in $list)
$item
$velocityCount
#end
velocityCount是Velocity提供的用来记录当前循环次数的计数器,默认从1开始计数,可以在velocity.properties文件中修改其初始值
条件控制语法
在Velocity中可以使用条件语法对流程进行控制
#if(condition)
...dosonmething...
#elseif(condition)
...dosomething...
#else
...dosomething...
#end
例如:
#if($!tradeOrderInfo.paymentType == 1)
第三方支付
#elseif($!tradeOrderInfo.paymentType == 2)
支付宝
#elseif($!tradeOrderInfo.paymentType == 3)
微信
#elseif($!tradeOrderInfo.paymentType == 10)
银行卡
#else
余额
#end
宏
在Velocity中也有宏的概念,可以将其作为函数来理解,使用#macro声明宏
① 宏的定义
#macro(宏的名称 $参数1 $参数2 …)
语句体(即函数体)
#end
② 宏的调用
#宏的名称($参数1 $参数2 …)
说明:参数之间用空格隔开。
例如:
#macro(gender $gender)
#if($!gender=="M")
男
#elseif($gender=="F")
女
#else
其他
#end
#end
#gender($!passenger.gender)
关系和逻操作符
Velocity 也具有逻辑AND, OR 和 NOT 操作符。
## example for AND
#if($foo && $bar)
<strong>This and that</strong>
#end
例子中#if() 指令仅在foo和bar 都为真的时候才为真。如果$foo 为假,则表达式也为假;并且 $bar 将不被求值。如果 foo为真,Velocity模板引擎将继续检查bar的值,如果 $bar 为真,则整个表达式为真。并且输出This AND that 。如果 $bar 为假,不输出 This AND that。
parse和include指令
在Velocity中可以通过parse或者include指令引入外部vm文件,但是二者存在区别:#parse只能指定单个对象,而#include可以指定多个,如果您需要引入多个文件,可以用逗号分隔就行。#include被引入文件的内容将不会通过模板引擎解析;而#parse引入的文件内容Velocity将解析其中的velocity语法并移交给模板。
#parse("/profit/lineChart.vm")
#include("/pay/CommonPayPage.vm")
内置对象
Velocity内置了一些对象,在vm模版里可以直接调用,列举如下:
request、request、request、response、$session,另外,模板内还可以使用 $msg内的消息工具访问 Struts 的国际化资源,达到简便实现国际化的方法。
数组
对数组的访问在Velocity中存在问题,因为Velocity只能访问对象的方法,而数组又是一个特殊的Array,所以虽然数组可以进行循环列举,但却不能定位访问特定位置的元素,如 strs[2] 这样的写法Velocity中是不存在。