Velocity简介

Posted 陈鹏烨

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Velocity简介相关的知识,希望对你有一定的参考价值。

 
什么是 Velocity
Velocity 是基于 Java 的模板引擎。它允许 Web 页面开发者引用 Java 代码中定义的方法。 Web 设计者可以和 Java 程序开发者并行开发遵循 MVC 模式的 Web 站点。这意味着, Web 设计者可以将精力放在好的 Web 站点设计上,而 Java 程序开发者可以将精力放在编写代码上。 Velocity Java 代码从 Web 页面中分离,使 Web 站点更具长期可维护性,并提供了一种替代 JSP php 的方案。
 
VTL(Velocity Template Language) 介绍
VTL 提供一种简单、容易和干静的方法将动态内容合并到 Web 页面。 VTL 使用引用 (references) 将动态内容插入到 Web 页面中。变量是一种引用,可以指向 Java 代码中的定义内容,或者由 Web 页面中的 VTL 语句来获得值。下面是一个可以插入到 html 文档的 VTL 语句的例子:
#set( $a = "Velocity" )
VTL 语句以 # 开头,并包含指令 (set) 。变量以 $ 开头,用引号引起。引号可以是单引号,也可以是双引号。前者引用具体的 String 值;后者可以包含 Velocity 引用,例如 ”hello, $name” $name 会用其当前的值替换。上面的例子是将值 Velocity 赋值给变量 a
当变量被赋值后,就可以在 HTML 文档的任何地方引用,下面是 Hello Velocity World! 的例子:
<html>
<body>
#set( $foo = "Velocity" )
Hello $foo World!
</body>
<html>
 
注释
VTL 支持单行注释(以 ## 开始)和多行注释(包括在 #* *# 之间),下面是一个例子:
This text is visible. ## This text is not visible.
This text is visible.
This text is visible. #* This text, as part of a multi-line comment,
is not visible. This text is not visible; it is also part of the
multi-line comment. This text still not visible. *# This text is outside
the comment, so it is visible.
## This text is not visible.
 
引用
VTL 3 种类型的引用:变量、属性和方法。作为一个设计者,必须和 Java 工程师在 VTL 引用的名称(标识符)上一致,以便在模板中使用它们。引用是作为 String 对象处理的。
1 )变量
变量的格式: $VTL 标识符
VTL 标识符以字母开始,由字母、数字、横划线 (-) 或下划线 (_) 组成。变量或者从模板中的 set 指令获得值(如前面的例子),或者 Java 代码(同名变量)中获得值。 Velocity 只处理已定义的变量引用,对于没有定义的变量引用, Velocity 原样返回。例如下面的例子:
#set( $foo = "gibbous" )
$moon = $foo
输出结果是: $moon = gibbous
2 )属性
属性的格式: $VTL 标识符 . VTL 标识符
下面是属性引用的例子:
$customer.Address
$purchase.Total
拿第一例子来说,有两种意思:
l          返回 Hashtable 对象 customer 中键值为 Address 的值
l          $customer.getAddress() 方法引用的缩写( JavaBean 属性的 getter 方法)
至于是哪种情况, Velocity 会做决定,返回合适的值。
3 )方法
方法的格式: $VTL 标识符 ( 参数列表 )
下面是方法引用的例子:
$customer.getAddress()
$purchase.getTotal()
$page.setTitle( "My Home Page" )
$person.setAttributes( ["Strange", "Weird", "Excited"] )
前面两个例子可以缩写成属性引用(如属性引用的例子)。属性引用和方法引用的主要区别是方法引用可以指定参数列表。
4 )正式引用符号: {}
正式引用符号在使用变量引用含糊的地方进行区分。看下面的例子:
#set( $ vice = " klepto" )
Jack is a $vicemaniac.
输出结果是: Jack is a $vicemaniac. $vicemaniac 没有定义,原样输出)
#set( $ vice = " klepto" )
Jack is a ${vice}maniac.
输出结果是: Jack is a kleptomaniac. (使用 正式引用符号将 $vice 和其它文本区分开)
5 Quit 引用符号: !
看下面的例子:
<input type="text" name="email" value="$email"/>
初始时, $email 没有值,所以文本框中会显示值 $email ,而更希望 是空白。下面是使用 Quit 引用符号的例子:
<input type="text" name="email" value="$!email"/>
$email 没有值时, Velocity 会用空串替代 $email
6 )特殊字符转义
对于 $ # 等特殊字符要正常显示,可以使用 / 进行转义, // 转义为 / 。下面是一个例子:
#set( $email = "foo" )
$email
/ $email
// $email
/// $email
输出结果是:
foo
$email
/ foo
/$email
指令 (Directives)
引用允许模板设计者为 Web 站点生成动态内容,而指令使巧妙处理 Java 代码的脚本元素容易使用。
1 #set
格式: #set( LHS = RHS )
l          LHS 可以是变量引用或属性引用
l          RHS 可以是引用、字符串、数字、 ArrayList Map
下面的例子展示了上面的每种 RHS 类型:
#set( $monkey = $bill ) ## variable reference
#set( $monkey.Friend = "monica" ) ## string literal
#set( $monkey.Blame = $whitehouse.Leak ) ## property reference
#set( $monkey.Plan = $spindoctor.weave($web) ) ## method reference
#set( $monkey.Number = 123 ) ##number literal
#set( $monkey.Say = ["Not", $my, "fault"] ) ## ArrayList
#set( $monkey.Map = {"banana" : "good", "roast beef" : "bad"}) ## Map
对于 ArrayList Map ,可以使用对应的 Java 方法访问其中的元素值:
$monkey.Say.get(0)
$monkey.Map.get("bannana")
$monkey.Map.banana ## same as above
l          RHS 可以是简单的算术表达式
#set( $value = $foo + 1 ) ## Addition
#set( $value = $bar - 1 ) ## Subtraction
#set( $value = $foo * $bar ) ## Multiplication
#set( $value = $foo / $bar ) ## Division
#set( $value = $foo % $bar ) ## Remainder
算术表达式只支持整型。 / 的结果为整数;如果非整型数值,返回 null
l          如果 RHS 的结果为 null ,是不会赋值给 LHS
看下面的例子:
#set( $criteria = ["name", "address"] )
#foreach( $criterion in $criteria )
    #set( $result = $query.criteria($criterion) )
    #if( $result )
        Query was successful
    #end
#end
上面使用 $result 检查是否执行成功是有问题的。如果第一次执行成功, $result 不为 null ,则后面的执行不管是否成功,检查条件总是成立。改进的方法是在每次执行前初始化为 false
#set( $criteria = ["name", "address"] )
#foreach( $criterion in $criteria )
#set( $result = false )
    #set( $result = $query.criteria($criterion) )
    #if( $result )
        Query was successful
    #end
#end
l          String 文字可以使用双引号或单引号括起。两者的主要区别是双引号中的引用会替换成相应的值,而单引号中的引用原样输出
#set( $directoryRoot = "www" )
#set( $templateName = "index.vm" )
#set( $template = "$directoryRoot/$templateName" )
$template
输出结果是: www/index.vm
如果使用单引号:
#set( $template = '$directoryRoot/$templateName )
输出结果是: $directoryRoot/$templateName
l          使用双引号可以实现字符串的串联,如下面的例子:
      #set( $size = "Big" )
      #set( $name = "Ben" )
      #set($clock = "${size}Tall$name" )
      The clock is $clock.
2 #if / #elseif / #else
#if 指令在条件成立时,显示 #if #end 之间的内容,否则显示 #else #end 之间的内容。下面是一个例子:
#if( $foo )
   <strong>Velocity!</strong>
#end
条件成立有两种情况:
l          如果 $foo boolean ,则 $foo 要为 true
l          否则, $foo 不为 null
#if 指令中可以使用的关系和逻辑符号包括:
l          < <= == >= >
l          &&(and) ||(or) !(not)
3 )循环: foreach
下面是一个例子:
<ul>
#foreach( $product in $allProducts )
    <li>$product</li>
#end
</ul>