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 ) 

你可能感兴趣的:(Web,velocity)