发布于 2016-05-16 15:30:26 | 400 次阅读 | 评论: 0 | 来源: PHPERZ
在VTL中,有三种类型的引用:变量、属性和方法。
变量的速记符号由前导“$”字符后随VTL标识符组成。VTL标识符必须以字母开头,其它合法字符包含:
字母
数值
连字符
下划线
下面是VTL中有效的变量引用:
$foo
$mudSlinger
$mud-slinger
$mud_slinger
$mudSlinger1
当VTL引用一个变量时,例如$foo,变量能从模板中的set指令或Java代码中的Context获取值。
#set( $word = "Hello Velocity!" )
${word}
代码:
Velocity.init();
VelocityContext context = new VelocityContext();
User user = new User();
user.setUsername("xxxx");
context.put( "user", user);
Template template = Velocity.getTemplate("src/main/java/com/study/velocity/Properties.vm");
StringWriter sw = new StringWriter();
template.merge(context, sw);
System.out.println(sw);public class User {
private String username;
public String getUsername() {
System.out.println("do get");
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
模板:
$user.username
输出结果:
do get
xxxx
由上面的结果表明,$user.username调用的就是user的getUsername方法。
方法引用由前导“$”字符后随VTL标识符和VTL方法体。VTL方法体由VTL标识符后随左圆括号、可选参数列表、右圆括号。下面是有效的VTL:
$sun.getPlanets()
$annelid.getDirt()
$album.getPhoto()
$sun.getPlanet( ["Earth", "Mars", "Neptune"] )
$sisyphus.pushRock()
$book.setTitle( "Homage to Catalonia" )
就像前面所说的,属性通常引用父对象的方法。Velocity很聪明,计算请求属性的方法。它基于命名规则查找方法。期望的查找序列依赖于是否属性名开始与大写字母。对于小写字母,例如$customer.address的顺序是:
getaddress()
getAddress()
get("address")
isAddress()
对于大写字母稍有不同:
getAddress()
getaddress()
get("Address")
isAddress()
每个引用(无论变量、属性或方法)最后产生的值转换为字符串对象。如果一个对象是Integer,那么Velocity将调用它的.toString()方法解析对象为字符串。
使用下标形式$foo[0]能用于访问指定索引的对象。这种形式的同义词在指定对象上调用get(Object)方法上一致,例如$foo.get(0)
$foo[0] ## $foo takes in an Integer look up
$foo[$i] ## Using another reference as the index
$foo["bar"] ## Passing a string where $foo may be a Map
括号语法也适用于Java数组,因为Velocity包装数组在访问对象中,提供get(Integer)方法返回指定元素。
括号语法在任何适用.get的地方都是有效的,例如:
$foo.bar[1].junk
$foo.callMethod()[1]
$foo["apple"][4]
引用也可以使用索引设置,例如:
#set($foo[0] = 1)
#set($foo.bar[1] = 3)
#set($map["apple"] = "orange")
上面的引用符号都是缩写,正式的引用符号如下所示:
${mudSlinger}
${customer.Address}
${purchase.getTotal()}
大多数情况下,可以使用缩写,但是在一种情况下,必须使用正式写法。
Jack is a $vicemaniac.
上面的例子中,变量是vicemaniac,但是我们实际想要的是vice,此时,我们可以在变量前后加上中括号来表示这个变量。
Jack is a ${vice}maniac.
当Velocity遇到了未定义的引用时,默认会原样输出引用。可以使用以下方式使其输出空串。
$!{email}