Velocity简介

Velocity是什么?

Velocity 是一个基于java 的模板引擎(template engine)。它允许任何人仅仅简单的使

用模板语言(template language)来引用由java 代码定义的对象。

当Velocity 应用于web 开发时,界面设计人员可以和java 程序开发人员同步开发一个遵

循MVC 架构的web 站点,也就是说,页面设计人员可以只关注页面的显示效果,而由java

程序开发人员关注业务逻辑编码。Velocity 将java 代码从web 页面中分离出来,这样为

web 站点的长期维护提供了便利,同时也为我们在JSP 和PHP 之外又提供了一种可选的方

案。

Velocity 的能力远不止web 站点开发这个领域,例如,它可以从模板(template)产生

SQL 和PostScript、XML,它也可以被当作一个独立工具来产生源代码和报告,或者作为

其他系统的集成组件使用。Velocity 也可以为Turbine web 开发架构提供模板服务

(template service)。Velocity+Turbine 提供一个模板服务的方式允许一个web 应用

以一个真正的MVC 模型进行开发。

Velocity能为我们作什么?

假设你是一家专门出售Mud 的在线商店的页面设计人员,让我们暂且称它为“在线

MUD 商店”。你们的业务很旺,客户下了各种类型和数量的mud 订单。他们都是通

过输入用户名和密码后才登陆到你的网站,登陆后就允许他们查看订单并购买更多的

mud。现在,一种非常流行的mud 正在打折销售。另外有一些客户规律性的购买另外

一种也在打折但是不是很流行的Bright Red Mud,由于购买的人并不多所以它被安置

在页面的边缘。所有用户的信息都是被跟踪并存放于数据库中的,所以某天有一个问题

可能会冒出来:为什么不使用velocity 来使用户更好的浏览他们感兴趣的商品呢?

Velocity 使得web 页面的客户化工作非常容易。作为一个web site 的设计人员,你

希望每个用户登陆时都拥有自己的页面。

你会见了一些公司内的软件工程师,你发现他们每个人都同意客户应该拥有具有个性化

的信息。那让我们把软件工程师应该作的事情发在一边,看一看你应该作些什么吧。

你可能在页面内嵌套如下的VTL 声明:

<html>

<body>

Hello $customer.Name!

<table>

#foreach( $mud in $nudsOnSpecial )

#if ( $customer.hasPurchased( $mud ) )

<tr>

<td>

$flogger.getPromo( $mud )

<td>

<tr>

#end

#end

</table>

Velocity Template Language(VTL):AN introduction

VTL 意味着提供最简单、最容易并且最整洁的方式合并页面动态内容。

VTL 使用references 来在web site 内嵌套动态内容,一个变量就是一种类型的

reference。变量是某种类型的refreence,它可以指向java 代码中的定义,或者从当前

页面内定义的VTL statement 得到值。下面是一个VTL statement 的例子,它可以被嵌

套到HTML 代码中:

#set ( $a = “Velocity” )

和所有的VTL statement 一样,这个statement 以#字符开始并且包含一个directive:

set。当一个在线用户请求你的页面时,Velocity Templating Engine 将查询整个页面以

便发现所有#字符,然后确定哪些是VTL statement,哪些不需要VTL 作任何事情。

#字符后紧跟一个directive:set 时,这个set directive 使用一个表达式(使用括号封

闭)――一个方程式分配一个值给变量。变量被列在左边,而它的值被列在右边,最后他们

之间使用=号分割。

在上面的例子中,变量是$a,而它的值是Velocity。和其他的references 一样以$字符开

始,而值总是以双引号封闭。Velocity 中仅有String 可以被赋值给变量。

记住以下的规则:

使用$字符开始的references 用于得到什么;使用#字符开始的directives 用于作些什么。

Hello Velocity World!

一旦某个变量被分配了一个值,那么你就可以在HTML 文件的任何地方引用它。在下面的

例子中,一个值被分配给$foo 变量,并在其后被引用。

<html>

<body>

#set ( $foo = “Velocity” )

Hello $foo World!

</body>

</html>

上面的实现结果是在页面上打印“Hello Velocity World!”

注解

单行注释:

## This is a single line comment.

多行注释:

#*

Thus begins a multi-line comment. Online visitors won’t

see this text because the Velocity Templating Engine will

ignore it.

*#

文档格式:

#**

This is a VTL comment block and

may be used to store such information

as the document author and versioning

information:

@version 5

@author

*#

References

在VTL 中有三种类型的references: 变量(variables) 、属性(properties) 、方法

(methods)。作为一个使用VTL 的页面设计者,你和你的工程师必须就references 的名

称达成共识,以便你可以在你的template 中使用它们。

Everything coming to and from a reference 被作为一个String 对象处理。如果有一

个对象$foo 是一个Integer 对象,那么Velocity 将调用它的toString()方法将这个对象

转型为String 类型。

变量

格式要求同java。

属性

例子:

$customer.Address

$purchase.Total

$customer.Address 有两种含义。它可以表示:查找hashtable 对象customer 中

以Address 为关键字的值;也可以表示调用customer 对象的getAddress()方法。

当你的页面被请求时,Velocity 将确定以上两种方式选用那种,然后返回适当的值。

方法

一个方法就是被定义在java 中的一段代码,并且它有完成某些有用工作的能力,例如

一个执行计算和判断条件是否成立、满足等。方法是一个由$开始并跟随VTL 标识符组

成的References,一般还包括一个VTL 方法体。例如:

$customer.getAddress()

$purchase.getTotal()

$page.setTitle( “My Home Page” )

$person.setAttributes( [“Strange”, “Weird”, “Excited”] )

前两个例子$customer.getAddress()和$purchase.getTotal()看起来挺想上面的

属性$customer.Address 和 $purchase.Total。如果你觉得他们之间有某种联系的

话,那你是正确的。

VTL 属性可以作为VTL 方法的缩写。$customer.Address 属性和使用

$customer.getAddress()方法具有相同的效果。如果可能的话使用属性的方式是比

较合理的。属性和方法的不同点在于你能够给一个方法指定一个参数列表。

正式reference标记

reference 的正是格式如下:

${mudSlinger} 变量

${customer.Address} 属性

${purchase.getTotal()} 方法

非正是格式更见常用,但是有时还是使用正是格式比较适合。例如:你希望通过一个变量

$vice 来动态的组织一个字符串。

Jack is a $vicemaniac.

本来变量是$vice 现在却变成了$vicemaniac,这样Veloctiy 就不知道您到底要什么了。

所以,应该使用正是格式书写

Jack is a ${vice}maniac

现在Velocity 知道变量是$vice 而不是$vicemaniac

Quiet reference notation

例如:

<input type=”text” name=”email” value=”$email” />

当页面的form 被初始加载时,变量$email 还没有值,这时你肯定是希望它能够显示一个

blank text 来代替输出”$email”这样的字段。那么使用quiet reference notation 就比

较合适。

<input type=”text” name=”email” value=”$!email”/>

这样文本框的初始值就不会是email 而是空值了。

正式和quiet 格式的reference notation 也可一同使用,像下面这样:

<input type=”text” name=”email” value=”$!{email}”/>

猜你喜欢

转载自aoyouzi.iteye.com/blog/2088642