分类: 系统运维
2012-12-14 11:15:20
Velocity入门
Velocity是基于Java的模板引擎。
Velocity是一种用于Web页面开发的编程语言,它允许Web页面开发程序员可以调用Java程序中定义的方法。
Velocity是一种允许开发人员快速开发Web页面的工具,正如它的名字的英文含义:速度、流通速度、速率;迅速,快速。
为什么使用Velocity使用Velocity的优点在于:
1. 很容易集成在各种各样的程序领域中;
2. 为网页制作人员提供了一种清晰而简单的语法;
3. 因为模板和代码是分离的,所以可以分别独立的开发和维护他们;
Velocity的优点在于其简单的模板语法已经成功实现对内容和现实方式的分离。有了Velocity,开发者可以专注于程序代码,设计者可以专注于页面的布局和视觉效果,不必在担心要在模板中嵌入各种程序代码。
1. Velocity引擎可以很容易得集成到一些Java运行环境,特别是Servlet中;
2. Velocity使得模板可以访问任何环境中的共有方法。
Velocity的强大之处在于它严格地区分程序开发功能的职责划分。它通过限制模板可能访问的对象(即后台程序允许其得到的对象)来实现这一点。这意味着网页设计人员可以只把精力放在数据的显示部分(View),而程序员则只要关注如何写好程序的控制侧(Controller)、商业螺距与数据管理(Model)。这就是典型的MVC开发模式,它简化了开发和日益复杂的应用和维护工作。
不过,Velocity用得最多的还是在基于Java Servlet的网页程序中作生成网页的引擎,以替代JSP等技术。除了使用比较容易外,它提供了强大的模板语言来显示和操作数据。值得注意的是,这不是生成数据,因为生成工作室逻辑部分的职责内容。
Velocity的工作流程
一般的,使用Velocity展示的页面都包含两部分:模板和模块程序。模板即包含Velocity的html文档,一般以vm为文件后缀名;模块程序为驱动程序,负责为模板提供数据等。
Velocity模板语言(VTL, Velocity Template Language)负责将动态页面内容插入到静态文本中。Velocity引擎翻译模板语言时,将所有遇到的变量标识符映射到VelocityContext对象中去。变量名称被替换成VelocityContext中提供的值,以此生成最终html文档并展示给用户。
VelocityContext用一个HashMap来保存数据。这个HashMap的键总是来自模板的变量标识符,它的值可以是一个字符串,也可以是一个对象。对于后者,Velocity可以通过调用该对象的public的方法来访问对象的内部数据。Velocity并不关心对象的创建过程和来源,只关心一个可用的创建好的对象。
Velocity语言规范Velocity的编程语言被称为VTL(Velocity Template Language)。VTL通过使用引用(reference)将动态内容放置到Web页面中去。VTL由Velocity模板文件所承载,这些模板文件以“vm”为后缀名。
VTL的句柄开头使用“#”,变量用“$”定义。如:
#set($str=”taobao”) |
这里将名称为“str”的变量赋值为“taobao”的字符串。定义完成后,$str可以在HTML文档中的任意地方使用。如:
#set ($str=”taobao”)
Good morning, $str
|
VTL的注释句柄开头使用“##”,对于大段注释则一般使用“#*”……“*#”。如:
#*Notation Period Notation Period Notation Period*#
##Notation Phase |
VTL还有一种正规写法,来帮助区分一些容易混淆出错的问题。对于任意在VTL中定义的变量,可以使用一对{}来限定变量名。比如
#set ($str1=”tao”) #set ($str2=”bao” Say hello,
${str1}${str2} Say hello,
${str1}123 |
如果不使用正规写法,则上述代码第四行为“ Say
hello, $str1123
#set ($str=”taobao”) #set ($taobao=$str) #set($num=10) |
Velocity会根据赋值内容自动为变量决定类型,如上例中,$str为String类型的变量,而$num为整型变量。
条件判断
#if ($str) # if ($str==”taobao”) #else if ($str==”world”) #else #end #end |
上述代码中,第一次循环的判定条件为,若$str为Boolean类型的变量,则判定是否为真;否则判定其是否为null。在VTL中,允许使用的关系和逻辑符号包括:
l <, <=, ==, >=, >
l &&, ||, !
循环遍历
#foreach ($str in $strlist ) #end |
这里,$strlist的内容可以是Vector,HashTable或ArrayList。
或是整型遍历,这里能且仅能对整型进行遍历操作。
#foreach ($num in [0…10]) #end |
Velocity还提供了循环计数功能
#foreach ($str in $strlist) #end |
Velocity提供了include句柄来将本地文件导入到指定的地方中。可导入多个文件,文件名间以逗号分隔。通常使用一个变量来指代这些文件。如:
#include (“hello.txt”,”world.txt”,$helloworld) |
导入的文件内容不会被模板引擎所解析。处于安全考虑,这些本地文件一般被放在TEMPLATE_ROOT目录下。
模板导入Velocity为导入包含VTL的本地文件提供了专门的方法——parse句柄。通过parse句柄导入的模板文件一次仅能导入一个。这些文件会被模板引擎所解析。parse句柄还允许被嵌套使用,嵌套深度由Velocity.propertities文件中的parse_directive.maxdepths深度决定。例:
Count down #set ($count=8) #parse (“parse.vm”) |
parse.vm的实现如下:
#set ($count=$count-1) $count #if ( $count >=0 ) #parse (“parse.vm”) #end |
最终输出为:
Countdown 7654321-1 |
#stop指令用于停止模板执行并返回,通常用于debug。
Velocimacros定义Velocimacros为Velocity用户在使用中定义一些可重复使用VTL模板。其功能类似于Java的方法。定义方法如下:
#macro (compare $c1 $c2) #if ($c1>$c2) $c1 #else $c2 #end #end |
转换为等同功能的Java代码可表示为:
void compare ( int c1, int c2 ) { if ( c1 > c2 ) else } |
定义完成后的应用如下:
最高出价为#compare ($priceA, $priceB) |
l Velocimacros的参数列表大小可以为0或正整数个
l Velocimacros必须在第一次使用前定义,因此parse句柄引用的模板中的Velocimacros会出现问题
l 引用作为Velocimacros的参数时,是使用by name形式的,这意味在Velocimacros内部每次使用时才会获得其值
l Velocimacros的返回不能作为另一个Velocimacros的参数使用
Velocity的Java方法调用Velocity可以在页面中获得后台Java程序提供的对象,并调用对象的方法。每个页面都有自己的context,后台程序只需要往这个context中放入需要的对象,Velocity就可以获取。
后台程序放入的对象在页面文档中以by name的形式获得。如:
context.put ( “str”, someString ) |
那在页面中就能得到$str的对象。Velocity可以调用任何方法,调用方式与Java调用无异。但在获得对象属性的时候,有简介写法。如:
假设someString对象有属性名为str,对应的get方法为getStr(),那么再Velocity中,可以写成$str.Str,这个句柄的作用于$str.getStr()相同。