首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

Velocity 学习基点

2012-12-28 
Velocity 学习基本点在VTL中有三种类型的references:变量(variables)、属性(properties)、方法(methods).变

Velocity 学习基本点

在VTL中有三种类型的references:变量(variables)、属性(properties)、方法(methods).
变量:
格式要求同java。
属性
$customer.Address
$purchase.Total
方法
? $customer.getAddress()
? $purchase.getTotal()
? $page.setTitle( “My Home Page” )
? $person.setAttributes( [“Strange”, “Weird”, “Excited”] )
reference的正是格式如下:
? ${mudSlinger}??????? 变量
? ${customer.Address}??? 属性
? ${purchase.getTotal()}??? 方法

$!{email},$!email

在VTL中使用$2.5这样的货币标识是没有问题得的,VTL不会将它错认为是一个reference,因为VTL中的reference总是以一个大写或者小写的字母开始。

Escaping valid VTL reference
VTL中使用“\”作为逃逸符。
例如:
? #set( $email = “foo” )
? $email
? \$email
? \\$email
? \\\$email
将render为:
? foo
? $email
? \foo
? \\$email
如果email变量没有被定义则
? $email
? \$email
? \\$email
? \\\$email
将被render为:
? $email
? \$email
? \\$email
? \\\$email
注意:VTL中未被定义的变量将被认为是一个字符串,所以以下例子:
? #set( $foo = “gibbous” )
? $moon = $foo
的输出结果是:
$moon = gibbous





Directives
Reference允许设计者使用动态的内容,而directive使得你可以应用java代码来控制你的显示逻辑,从而达到你所期望的显示效果。
? #set
? #set directive被用于设置一个reference的值。例如:
??? #set ( $primate = “monkey” )
??? #set ( $customer.Behavior = $primate )
赋值左侧的(LHS)必须是一个变量或者属性reference。右侧(RHS)可以是以下类型中一种:
l? 变量reference
l? String literal
l? 属性reference
l? 方法reference
l? number literal
l? ArrayList
下面是应用各种类型的RHS的例子:
? #set ( $monkey = $bill ) ##变量reference
? #set ( $monkey.Friend = “monica” ) ##String literal
? #set ( $monkey.Blame = $whitehouse.Leak )##属性reference
? #set ( $monkey.Plan = $spindoctor.weave($web) )##方法reference
? #set ( $monkey.Number = 123 )##Number literal
? #set ( $monkey.Say = [“Not”, $my, “fault”] )##ArrayList
注意:最后一个例子的取值方法为:$monkey.Say.get(0)
RHS也可以是一个简单的算术表达式:
? #set ( $value = $foo + 1 )
? #set ( $value = $bar -1 )
#set ( $value = $foo * $bar )
#set ( $value = $foo / $bar )
如果你的RHS是一个null,VTL的处理将比较特殊:它将指向一个已经存在的reference,这对初学者来讲可能是比较费解的。例如:
? #set ( $resut = $query.criteria(“name”) )
? The result of the first query is $result

? #set ( $resut = $query.criteria(“address”) )
? The result of the second query is $result
如果$query.criteria(“name”)返回一个“bill”,而$query.criteria(“address”)返回的是null,则显示的结果如下:
? The result of the first query is bill
? The result of the first query is bill
看看下面的例子:
? #set( $criteria = ["name", "address"] )
#foreach( $criterion in $criteria )
#set( $result = $query.criteria($criterion) )
? #if( $result )
? Query was successful
???? #end
#end
在上面的例子中,程序将不能智能的根据$result的值决定查询是否成功。在$result被#set后(added to the context),它不能被设置回null(removed from the context)。打印的结果将显示两次查询结果都成功了,但是实际上有一个查询是失败的。
为了解决以上问题我们可以通过预先定义的方式:
? #set( $criteria = [“name”, “address”] )
? #foreach( $criterion in $criteria )
??? #set( $result = false )
??? #set( $result = $query.criteria( $criterion ) )
??? #if( $result )
????? Query was successful
??? #end
? #end
? String Literals
? 当你使用#set directive,String literal封闭在一对双引号内。
??? #set ( $directoryRoot = “www” )
??? #set ( $templateName = “index.vm” )
??? #set ( $template = “$directoryRoot/$tempateName” )
??? $template
? 上面这段代码的输出结果为:www/index.vm
? 但是,当string literal被封装在单引号内时,它将不被解析:
??? #set ( $foo = “bar” )
??? $foo
??? #set ( $blargh = ‘$foo’ )
? 结果:
??? bar
??? $foo



这里需要注意一点:Velocity context仅仅能够包含对象,所以当我们说“boolean”时实际上代表的时一个Boolean对象。

注意这里的Velocity的数字是作为Integer来比较的――其他类型的对象将使得条件为false,但是与java不同它使用“==”来比较两个值,而且velocity要求等号两边的值类型相同。


include: #include script element允许模板设计者引入本地文件

parse: #parse script element允许模板设计者一个包含VTL的本地文件。

当将一个reference作为参数传递给Velocimacro时,请注意reference作为参数时是以名字的形式传递的。这就意味着参数的值在每次Velocimacro内执行时才会被产生。这个特性使得你可以将一个方法调用作为参数传递给Velocimacro,而每次Velocimacro执行时都是通过这个方法调用产生不同的值来执行的。例如:
? #macro ( callme $a )
??? $a $a $a
? #end
? #callme( $foo.bar() )
执行的结果是:reference $foo的bar()方法被执行了三次。
如果你不需要这样的特性可以通过以下方法:
? #set ( $myval = $foo.bar() )
? #callme ( $myval )?

热点排行