当前位置:首页 > Velocity用户手册 - 中文版(学习修改版)
\\\\$email \\\\\\$email
注意:VTL中未被定义的变量将被认为是一个字符串,所以以下例子: #set( $foo = “gibbous” ) $moon = $foo 的输出结果是: $moon = gibbous Case substitution
现在你已经对reference比较熟悉了,你可以将他们高效的应用于你的template了。Velocity利用了很多java规范以方便了设计人员的使用。例如: $foo
$foo.getBar() ## is the same as $foo.Bar
$data.getUser(“jon”) ## is the same as $data.User(“jon”)
$data.getRequest().getServerName() # is the same as
$data.Request.ServerName ## is the same as
${data.Request.ServerName}
但是,注意VTL中不会将reference解释为对象的实例变量。例如:$foo.Name将被解释为Foo对象的getName()方法,而不是Foo对象的Name实例变量。 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 = [\#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.properties文件的
stringliterals.interpolate = false的值来改变上面的特性是否有效。 条件语句
if/elseif/else
当一个web页面被生成时使用Velocity的#if directrive,如果条件成立的话可以在页面内嵌入文字。例如: #if ( $foo )
Velocity! #end
上例中的条件语句将在以下两种条件下成立:
l $foo是一个boolean型的变量,且它的值为true l $foo变量的值不为null
这里需要注意一点:Velocity context仅仅能够包含对象,所以当我们说
“boolean”时实际上代表的时一个Boolean对象。即便某个方法返回的是一个boolean值,Velocity也会利用内省机制将它转换为一个Boolean的相同值。 如果条件成立,那么#if和#end之间的内容将被显示。 #elseif和#else元素可以同#if一同使用。例如: #if( $foo < 10 )
Go North #elseif( $foo == 10 )
Go East #elseif( $foo == 6 )
Go South #else
Go West #end
注意这里的Velocity的数字是作为Integer来比较的――其他类型的对象将使得条件为false,但是与java不同它使用“==”来比较两个值,而且velocity要求等号两边的值类型相同。 关系、逻辑运算符
Velocity中使用等号操作符判断两个变量的关系。例如: #set ( $foo = “deoxyribonucleic acid” )
#set ( $bar = “ribonucleic acid” ) #if ( $foo == $foo )
In this case it’s clear they aren’t equivalent.So? #else
They are not equivalent and this will be the output. #end
Velocity有AND、OR和NOT逻辑运算符。下面是一些例子: ## logical AND
#if( $foo && $bar )
This AND that #end
## logical OR
#if ( $foo || $bar )
This OR That #end
##logical NOT #if ( !$foo )
NOT that #end 循环
Foreach循环 例子:
#foreach ( $product in $allProducts )
每次循环$allProducts中的一个值都会赋给$product变量。
$allProducts可以是一个Vector、Hashtable或者Array。分配给$product的值是一个java对象,并且可以通过变量被引用。例如:如果$product是一个java的Product类,并且这个产品的名字可以通过调用他的getName()方法得到。 现在我们假设$allProducts是一个Hashtable,如果你希望得到它的key应该像下面这样:
#foreach ( $key in $allProducts.keySet() )
Velocity还特别提供了得到循环次数的方法,以便你可以像下面这样作: