使用 velocity 实现客户端和服务器端模板

上传人:第*** 文档编号:30561702 上传时间:2018-01-30 格式:DOC 页数:16 大小:258.50KB
返回 下载 相关 举报
使用 velocity 实现客户端和服务器端模板_第1页
第1页 / 共16页
使用 velocity 实现客户端和服务器端模板_第2页
第2页 / 共16页
使用 velocity 实现客户端和服务器端模板_第3页
第3页 / 共16页
使用 velocity 实现客户端和服务器端模板_第4页
第4页 / 共16页
使用 velocity 实现客户端和服务器端模板_第5页
第5页 / 共16页
点击查看更多>>
资源描述

《使用 velocity 实现客户端和服务器端模板》由会员分享,可在线阅读,更多相关《使用 velocity 实现客户端和服务器端模板(16页珍藏版)》请在金锄头文库上搜索。

1、使用 Velocity 实现客户端和服务器端模板灵活的模板引擎为 JSP 技术提供一种没有遗产负担的选择级别: 初级Sing Li (), 作家, Wrox Press2004 年 3 月 13 日Velocity 是一种通用的、开放源代码的模板解决方案,可以在报告生成/数据转换应用程序中独立使用,也可以在 MVC 模型框架中作为视图组件。本文中,Sing Li 介绍了 Velocity,并说明如何将其模板处理功能集成到客户端独立应用程序、服务器端 Web 应用程序或者 Web 服务中。在 HTML 或者 XML 这样的标准表示或交换格式中,文本性数据的操作和转换是一种频繁而且通常非常单调的活

2、动,每个开发人员都会遇到。模板引擎可以改善这个过程,它在模板中保留输出中的静态部分,而动态生成和安排变化的部分。Velocity 是一种高度实用的、开放源代码的模板引擎,可以方便地集成到其他客户端或服务器端应用程序中。对于服务器端应用程序,如果与兼容 Servlet 2.3+ 的 Web 层容器集成,Velocity 为 JSP 技术提供了一种可行的替代方案,可以强制实施表示逻辑与应用程序业务逻辑的清晰划分。事实上,Velocity 支持的模板语言非常简单,形成的模板也十分清晰,Web 站点设计人员和样式开发人员可以学习和维护这些模板。本文中将考察 Velocity 的简单模板语言、创建一些模

3、板并将其用于独立的客户应用程序。然后我们将把这个模板引擎集成到 Struts MVC 框架中作为视图组件。基本模板引擎操作基本模板引擎操作非常简单。首先看一看清单 1 中的模板:清单 1. 基本的 Velocity 模板A Template Based PageThis is a page generated by $generatedBy.The customers name is $customerName.这个模板是一个完整的 HTML 文件。您可以使用文本编辑器或者喜欢的图形化可视网页编辑器创建该文件。创建的简易性是基于模板的系统的主要好处和要求。当模板引擎运行时,清单 1 中彩色显示

4、的部分将被实际的数据替换。获取数据并与模板结合的过程称为 合并 。看一看清单 2 中的脚本所表示的数据: 清单 2. 为模板合并设置数据值#set ($generatedBy = Velocity)#set ($customerName = John Doe)文档选项将此页作为电子邮件发送未显示需要 JavaScript 的文档选项现在,如果清单 1 中的模板与清单 2 中的数据合并,将得到清单 3 所示的结果:清单 3. 合并到模板中的数据A Template Based PageThis is a page generated by Velocity.The customers name

5、is John Doe.您可能发现,这种特性和字处理程序中的邮件合并功能类似。在字处理程序中,信函结构与来自邮件列表的名称和地址合并。和邮件合并一样,这种应用程序最适用于要合并的数据源非常大而且有变化的情况。从这个单纯的意义上讲,Velocity 是一个模板引擎。 Velocity 的输出格式仅受文本模板中所能放置的内容的限制。包括现在最流行的格式(HTML、XML 、SQL,等等)。使用 Velocity 模板语言创建模板Velocity 模板是文本文件(HTML、XML 等等),其中包括: 照原样合并的静态部分 将被要合并的数据替代的占位符 脚本语言中的指示符和指令 Velocity 模板

6、使用的脚本语言称为 Velocity 模板语言(VTL)。和其他脚本语言相比,VTL 语法相对而言不是很丰富。任何具有编程背景的人都可以非常快地学会 VTL。占位符与引用VTL 中的引用是一个命名元素,如 $customerName 。引用可以在 Velocity 模板中作为占位符。在模板合并过程中,这些占位符将被替换成相应的文本值,从而形成最终的输出。比如,在 清单 1 中,我们可以看到使用了两个 VTL 引用( $generatedBy 和 $customerName )已生成最终输出结果。 变量在 VTL 中是一种引用类型。您可以使用 #set() 指示符为变量赋值。清单 4 给出了一些

7、例子: 清单 4. 变量类型的 VTL 引用#set( $this = Velocity)#set( $numericBase = 999 )#set( $booleanCondition = true )This page is generated using $this.There are ($numericBase + 1) pages in total.变量名必须从一个字母开始,因此 Velocity 很容易把变量名与模板中的货币符号分开(比如, $100 不可能是一个变量名)。合并操作中所有的变量都被转化成字符串,可能造成一些有趣的现象。看一看清单 4 中用红色显示的文本。合并后的输

8、出如清单 5 所示:清单 5. 合并后的模板中带有数字值的变量This page is generated using Velocity.There are (999 + 1) pages in total.因为 $numericBase 在合并操作中被转化成了字符串,因此不会执行算术操作。因为 VTL 专门用于模板操作而非通用的计算语言,所以只需要支持整数算术运算(尽管可以使用插件工具进行扩展)。下面的脚本说明了如何利用这种数学运算能力: #set( $newSum = $numericBase + 1)There are $newSum pages in total.该模板合并后相应的输出

9、为:There are 1000 pages in total.到目前我们处理的还只有标量。要创建包含多个元素的 ArrayList 变量,可以使用如下的语法: #set( $treeList = pine, oak, maple, redwood)您可以使用 $treeList.get(1) 列表中的第二个元素。 赋值以后, $treeList 就是一个基于 ArrayList 的变量(就像是标准 JDK 集合类中那样)。您可以直接使用符号 $treeList.get(n) 访问它的每个元素,其中的 n 是以 0 为基的 ArrayList 索引。比如,像 清单 6 种红色显示的一行所表明的

10、那样, $treeList.get(1) 用于选择 ArrayList 中第二项,即 oak。这种调用 ArrayList 类方法的语法也可用于调用其他变量对象的方法(更多信息请参阅侧栏中的 属性和方法参考)。 关于占位符替换的一点说明:Velocity 把任何不能识别的引用作为普通文本打印,如清单 6 中下面突出显示的两行(蓝色和红色)所示:清单 6. 占位符置换The second item in the list is $treeList.get(1).$notDeclared is an undeclared variable.But $!notDeclared is invisibl

11、e when not declared.VTL 支持一种静态引用符号,以避免呈现不存在的或者 空的 引用。如果使用安静引用符号,比如 $!notDeclared ,那么 Velocity 将什么也不输出,而不是输出完整的引用名。注意变量名前面的“!”表示这是静态引用符号。当合并清单 6 中的模板时,两个引用都没有分配任何值,但是蓝色显示的引用将原样显示,而绿色的一个则看不到: 属性和方法参考除了在模板中设置变量之外,VTL 引用也可以是对象属性或方法。这些对象是模板可以使用的 Java 类(一般通过上下文,参阅 Velocity 上下文)。 对象属性通过和 Javabean 类似的符号访问。比

12、如,可以通过 VTL 引用 $customer.LastName 访问 $customer 对象的 LastName 属性。在幕后,Velocity 使用对象的访问器方法获得属性值(即调用对象的 getLastName() 方法)。 您可以用和属性访问类似的符号调用对象的方法,可以带参数列表也可以不带。比如,可以通过 VTL 引用 $customer.getPhone(mobile) ,调用 $customer 对象的 getPhone() 方法获得移动电话号码。 The second item in the list is oak.$notDeclared is an undeclared

13、variable.But is invisible when not declared.选择性呈现和循环可以使用指示符 #if. #then. #else. 有条件地呈现模板中特定的部分。清单 7 给出了一个例子: 清单 7. 使用 #if、#then 和 #else 有选择地呈现#if $customer.GoldMember Thank you Mr. $customer.LastName, for flying with us. Your loyal patronage is greatly appreciated. This flight earns you an additional

14、 5000 miles.#elseThank you for flying with us. Please consider joining our frequent flyer program.#endif在清单 7 的模板中,使用 $customer 对象的 boolean 属性 GoldMember 确定在最终输出中出现哪些信息。对于金牌顾客,最终输出中将呈现蓝色显示的消息;对于其他顾客,则在最终输出中呈现绿色显示的消息。 模板中经常要使用循环格式化表格或者列表形式的信息。显示的数据通常保存在一个 ArrayList 引用中。在 Velocity 中唯一用于处理重复循环的指示符是 #fo

15、reach 指示符。清单 8 中的模板通过 $treeList ArrayList 变量演示了 #foreach 指示符的用法。当然,也可以使用任何其他可用的集合类型的对象引用,或者返回一个集合的对象属性/方法引用。 清单 8. 使用 #foreach 循环Tree Name#foreach $name in $treeList$name is a big tree!#end$treeList 中包含树名的列表,清单 8 中的模板合并后的输出如清单 9 所示: 清单 9. #foreach 循环中合并后的输出Tree Namepine is a big tree! oak is a big t

16、ree!maple is a big tree!redwood is a big tree!如果从 HTML 浏览器中查看,清单 9 当然就是一个包含树名的表。注意在 #foreach 循环体内有一个内置的计数器,可以在 #foreach 指示符循环体内通过 $velocityCounter 引用访问它。默认情况下,这个计数器从 1 开始,每执行一次循环递增一次。 Velocity 中的宏Velocity 的一个主要特性是能够很容易地定义宏,称为 Velocimacros。宏使您能够很容易地封装和重用模板脚本。默认情况下,宏保存在 VM_global_library.vm 文件中。比如,考虑清单 10 中名为 #showTree() 的 Velocimacro: 清单 10. 定义 Velocimacro#macro (showTree)#if ($treeList )#foreach ($e in $tr

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号