1关于本指南
本指南是VTL(Velocity Template Language)的参考文档。至于更多信息,请查阅Velocity用户手册(Velocity User Guide)
2语法参考
2.1变量
符号:
$[!][{][a..z,A..Z][a..z,A..Z,0-9,-,_][]]
大家对上面的表示不知道清楚不清楚,我这儿给大家描述一边,以后类似的表述都是这样。“[]”表示可选项,意为可有可无。通过上面的表述可以看出变量一个必写项和若干个可选项组成。其中$是必写项,其余的都是可选项。
例如:
•一般符号:$mud-slinger_9
•静态符号:$!mud_slinger_9
•正式符号:${mud_slinger_9}
2.2属性
符号:
$[{][a..z,A..Z][a..z,A..z,0..9,-,_]*.[a..z,A..Z][a..z,A..Z,0..9,-,_]*[}]
例如:
•一般符号:$customer.Address
•正式符号:${purchase.Total}
2.3方法
符号:
$[{][a..z,A..Z][a..z,A..Z,0..9,-,_]*.[a..z,a..Z][a..z,A..Z,0..9,-,_]*([可选参数列表…])[}]
例如:
•一般符号:$customer.getAddress()
•正式符号:${puchase.getTotal()}
•带有参数列表的一般符号:$page.setTile(“My Home Paget”)
VTL属性值表示的简短使用代替了VTL方法表示中的get和set方法。例如,$object.getMethod()或者$object.setMethod()使用VTL属性值表示可将其简化为$object.Method。在使用时这样表示方法通常更加便捷的。属性值表示和方法表示最主要的区别在于是否有传递的参数,如果有参数则需要是用方法表示,如果没有参数就可以直接使用属性值表示。
3指令
3.1#set-确立变量、属性、方法的值
格式:
#[{] set[}]($ref=[“,’]arg[”,’])
用法:
•$ref-等号左边必须是一个变量或者属性值
•$arg-等号右边的arg可以用双引号或者单引号组成的字符串或者字符。如果等号右边是NULL,那等号左边将无法被赋值。
例如:
•变量:#set($monkey=$bill)
•字符串:#set($monkey.Friend=’monica’)
•属性值:#set($monkey.Blame=$whitehouse.Leak)
•方法:#set($monkey.Plan=$spindoctor.weave($web))
•一般:#set($monkey.Number=123)
•列表:#set($monkey.Numbers=[1..3])
•数组:#set($monkey.Say=[“Not”,$my,”fault”])
等式右边也可以是一个简单的算术表达式,例如:
•加法:#set($value=$foo+1)
•减法:#set($value=$bar-1)
•乘法:#set($value=$foo*$bar)
•除法:#set($value=$foo/$bar)
•求余:#set($value=$foo%$bar)
3.2#if/#elseif/#else-条件判断
格式:
#[{]if[}]([判断条件])[输出内容][#[{ ]elseif[ }]([判断条件])[输出内容]]*[# [{ ]else[ }]([判断条件])[输出内容]]# [{ ]end[ }]
例如:
Operator Name
|
Symbol
|
Alternative Symbol
|
Example
|
Equals Number
|
==
|
eq
|
#if( $foo == 42 )
|
Equals String
|
==
|
eq
|
#if( $foo == "bar" )
|
Object Equivalence
|
==
|
eq
|
#if( $foo == $bar )
|
Not Equals
|
!=
|
ne
|
#if( $foo != $bar )
|
Greater Than
|
>
|
gt
|
#if( $foo > 42 )
|
Less Than
|
<
|
lt
|
#if( $foo < 42 )
|
Greater Than or Equal To
|
>=
|
ge
|
#if( $foo >= 42 )
|
Less Than or Equal To
|
<=
|
le
|
#if( $foo <= 42 )
|
Boolean NOT
|
!
|
not
|
#if( !$foo )
|
注意:
1.“== “操作可以用来比较数字,字符串,或同一个类的不同对象或不同类型的对象. 当是不同类的对象时,会调用它们的toString()命令结果来做比较看是否相等.
2.你也可以用括弧来限定指令。当书写时紧跟一个#else,这是就需要将该else指令限定。
#if( $foo == $bar)it's true!#{else}it's not!#end</li>
3.3#foreach-对象循环
格式:
#[{] foreach[}]($ref in arg)statement#[{] end[}]
用法:
•$ref-用于循环的变量
•arg-可能是一个列表引用(i.e.object.array,collection,or map),或者一个array list,或者其他列表。
•statement-当velocity发现下一个有效对像在列表中,输出可以是一个合法的VTL.
例如下面省略statement的#foreach():
•引用:#foreach($item in $items)
•数组:#foreach($item in [“Not”,$my,”fault”])
•列表:#foreach($item in[1...3])
Velocity提供一个简单的方式实现循环计数器,这样你可以根据一下来做:
<table>
#foreach( $customer in $customerList )
<tr><td>$velocityCount</td><td>$customer.Name</td></tr>
#end
</table>
循环计数器引用中有一个默认的名字-$velocityCount,它是在velocity.properties中定义。计数器默认设置从1开始计数,同样你也可以在velocity.properties中进行设定成0或者1。计数器的部分属性参数可以在velocity.properties文件里找到:
# Default name of the loop counter
# variable reference.
directive.foreach.counter.name = velocityCount
# Default starting value of the loop
# counter variable reference.
directive.foreach.counter.initial.value = 1
在Velocity1.5中加入了对计数器最大值的限制,默认值是-1,表示没有限制。
# The maximum allowed number of loops.
directive.foreach.maxloops = -1
3.4#include-加载不用被Velocity解析的本地文件
格式:
#[{]include[}](arg[arg2…argn])
•arg-在TEMPLATE_ROOT下引用一个有效的文件
例如:
•字符串:#include( "disclaimer.txt" "opinion.txt" )
•变量:#include( $foo $bar )
3.5#parse-加载一个需要被Velocity解析的本地模板
格式:
#[{]parse[}](arg)
•arg-在TEMPLATE_ROOT下引用一个模板
例如:
•字符串:#parse( "lecorbusier.vm" )
•变量:#parse( $foo )
通过设置配置中的解析层次深度的最大值velocity.properties中项 parse_directive.maxdepth in可以防止死循环. (The default parse depth is 10.)
3.6#stop-停止模板引擎
格式:
#[{]stop[}]
用法:
它将停止执行流动中的模板。这对调试模板来说很不错。
3.7#evaluate-动态的估计一个字符串或者引用
格式:
#[{] evaluate[}](arg)
•arg-被动态估计的字符串或者
例如:
c字符串:#evaluate( 'string with VTL #if(true)will be displayed#end' )
•变量:#include( $foo )
3.8#macro-让用户可以定义宏操作(Velocimacro (VM):一组实现特定功能的VTL
格式:
#[{]macro[}](vmname $arg1[$arg2 $arg3 … $argn])[VM VTL code…]# [{]end[}]
•vmname – 宏名字 VM (#vmname)
•$arg1 $arg2 [ ... ] – 要传给宏的参数VM
•[ VM VTL code... ] –宏代码,有效的VTL
一旦定义,VM就像是模板中任何别的VTL指令。
#vmname( $arg1 $arg2 )
VMs可以被定义在两个地方:
1.Template library:可以配置用户定义的库,以便全站使用。
2.Inline:放入到一般的模板文件中,仅当配置参数velocimacro.permissions.allowInline=true时生效。
4注解
4.1单行注解
例如:
##This is a comment.
4.2多行注解
例如:
#*
This is a multiline comment.
*#