回到顶部
您的当前位置: 编程语言> JAVA> JAVA项目> Velocity
Apache Velocity(四)引用符
2014-06-02 21:13:23
标签: 网络整理 Velocity 引用符
非正式引用符(References)

在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
正式引用符(Formal Reference Notation)

非正式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与文本连接在一起的情况。

非空引用符(Quient reference notation)

当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}"/>