在VTL中有三种类型的references:变量(variables)、属性(properties)、方法(methods)。作为一个使用VTL的页面设计者,你和你的工程师必须references的名称达成共识,以便你可以在你的template中使用它们。
所有的reference被作为一个String对象处理,如果有一个对象$foo是一个Integer对象,那么Velocity将调用它的toString()方法将这个对象转型为String类型。
1、变量(variables)
非正式变量是由“$”开头,接着是VTL标识符。VLT标识符必须以字母(a..z,A..Z)开头,剩下的部分限于以下几种:
◇ 字母(a..z,A..Z)
◇ 数字(0..9)
◇ 连字符(“-”)
◇ 下划线(“_”)
这里是几个在VTL中有效的变量reference。
$foo $mudSlinger $mud­slinger $mud_slinger $mudSlinger1
当VLT定义一个变量,例如$foo,变量能或者通过模板中的set方法,或者通过 Java代码获得值。例如,Java变量$foo的值是bar,在这个模板被请求时,在网页上bar会替代所有$foo。选择地,假如包括了下面的声明:
#set($foo="bar")
按照这样的设置,输出就会跟之前的一样。
2、属性(properties)
第二种有趣的VTLreference就是属性,而且属性有一种与众不同的格式。非正式变量是由“$”开头,接着是VTL标识符,再接着就是字符(“.”)和其他的VLT标识符。这里是一些在VLT中有效属性的定义:
$customer.Address $purchase.Total
在第一个例子中$customer.Address有两种含义。它可以表示:查找hashtable对象customer中以Address为关键字的值;也可以表示调用customer对象的getAddress()方法。当你的页面被请求时, Velocity将确定以上两种方式选用那种,然后返回适当的值。
3、方法(methods)
一个方法就是被定义在java中的一段代码,并且它有完成某些有用工作的能力,例如一个执行计算和判断条件是否成立、满足等。方法是一个由$开始并跟随VTL 标识符组成的References,一般还包括一个VTL方法体。一个VTL方法体包括一个VLT标识接着一个左括号(“(”),接着是参数列表,再接着是右括号(“)”)。这里是一些在VTL中有效的方法定义:
$customer.getAddress() $purchase.getTotal() $page.setTitle( "My Home Page" ) $person.setAttributes( ["Strange","Weird", "Excited"] )
前两个例子$customer.getAddress()和$purchase.getTotal()看起来挺想上面的属性$customer.Address和$purchase.Total。如果你觉得他们之间有某种联系的话,那你是正确的。VTL属性可以作为VTL方法的缩写,$customer.Address属性和使用$customer.getAddress()方法具有相同的效果。如果可能的话使用属性的方式是比较合理的。属性和方法的不同点在于你能够给一个方法指定一个参数列表。
非正式定义能够用下面的方法:
$sun.getPlanets() $annelid.getDirt() $album.getPhoto()
我们期待那些方法返回属于太阳系的行星的名称,喂养我们的蚯蚓,或者从相册里面取出一张照片。只有长符号为下面的方法服务。
$sun.getPlanet( ["Earth","Mars", "Neptune"] ) ## Can't pass a parameter list with$sun.Planets $sisyphus.pushRock() ## Velocity assumes I mean $sisyphus.getRock() $book.setTitle( "Homage to Catalonia" ) ## Can't pass a parameter
非正式references用于上述的例子中,但是同样有正式的references,如下面所示:
${mudSlinger} ${customer.Address} ${purchase.getTotal()}
在几乎所有场合你都可以使用非正式references,但是在某些场合,只能使用正式 reference才能正确处理。
设想你创建一个句子:$vice作为句子的名词。目标是为了使某些人选择不同的词,产生下面两种结果之一:"Jack is a pyromaniac."或者"Jack is a kleptomaniac."。使用非正式定义不太适合用于这种情况。看一下下面的例子:
Jack is a ${vice}maniac.
本来变量是$vice 现在却变成了$vicemaniac,这样 Veloctiy 就不知道您到底要什么了。所以,应该使用正是格式书写
Jack is a $vicemaniac.
现在Velocity就知道reference是$vice,而不是$vicemaniac。正式定义经常用于模板中refernces与文本连接在一起的情况。
当Velocity遇到没有定义的reference,通常它会直接输出reference。假如下面的reference出现在一个VTL模板中:
<input type="text"name="email" value="$email"/>
当form最初加载的时候,变量$email没有值,但你想出现一个空白的文本框设定值为“$email”。使用quiet reference notation可以使Velocity正常显示,你需要用$!email,代替$email。所以上面的例子, 会改成下面:
<input type="text"name="email" value="$!email"/>
这样文本框的初始值就不会是email而是空值了,正式和quiet格式的reference notation也可一同使用,像下面这样:
<input type="text"name="email" value="$!{email}"/>