当前位置:文档之家› Velocity简明教程1

Velocity简明教程1

一、简介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模型进行开发。

二、基本语法1 总括1.1 "#"用来标识Velocity 的脚本语句,包括#set、#if 、#else、#end、#foreach、#end、#iinclude、#parse、1.3 "{}"用来明确标识Velocity 变量。

比如在页面中,页面中有一个$someonename,此时,Velocity 将把someonename 作为变量名,若我们程序是想在someone 这个变量的后面紧接着显示name 字符,则上面的标签应该改成${someone}name。

1.4 "!"用来强制把不存在的变量显示为空白。

如当页面中包含$msg,如果msg 对象有值,将显示msg 的值,如果不存在msg 对象同,则在页面中将显示$msg 字符。

这是我们不希望的,为了把不存在的变量或变量值为null 的对象显示为空白,则只需要在变量名前加一个“!”号即可。

如:$!msgd1 变量1.1 变量的定义Veloctiy是一种弱类型的语言,语法结构非常简单,但在jetspeed却非常实用。

因为是一种弱类型语言,所以不用定义变量的类型,编译器根据赋值的类型自动进行判断,定义的关键字为set,set前要加#,变量名前必须加$,第一个字符必须为字母。

变量可以包含的字符有以下内容:alphabetic (a .. z, A .. Z),numeric (0 .. 9),hyphen ("-"),underscore ("_")。

当使用#set指令时,括在双引号中的字面字符串(string literal)将解析和重新解释,但是,当string literal 被封装在单引号内时,它将不被解析。

上面这个特性可以通过修改velocity.properties文件的stringliterals.interpolate = false的值来改变上面的特性是否有效。

注:在velocity 中使用$2.5这样的货币标识是没有问题得的,因为velocity 中的变量总是以 "$" 开头,第一个字符必须为字母。

1.2 变量规范的写法(正式格式)${name},也可以写成:$name 。

提倡用前面的写法。

例如:你希望通过一个变量$vice 来动态的组织规范的格式书写 : Jack is a ${vice}maniac现在Velocity 知道变量是$vice 而不是$vicemaniac 。

注意:当引用属性的时候不能加{}$与$!的区别:当找不到username 的时候,$username 返回字符串"$username",而$!username 返回空字符串""。

双引号与引号:1.3 变量的赋值变量名和值的组合要放在小括号中,不必用分号结束语句。

例如: 赋值的左边必须是一个变量或者是属性引用。

右边可以是下面六种类型之一:变量引用,字面字符串,属性引用,方法引用,字面数字,数组列表。

支技持算术运算符。

下面的例子演示了上述的每种类型: 注意:①如果上述例子中的右值是null, 则左值不会被赋值,也就是说会保留以前的值。

在下面的例子中,左边的程序将不能智能的根据$result 的值决定查询是否成功。

在$result 被#set 后(added to the context ),它不能被设置回null (removed from the context )。

打印的结果将显示两次查询结果都成功了,但是实际上有一个查询是失败的。

为了解决以上问题可以通过预先定义的方式,如右边程序:2 属性$customer.Address$hashtable user中的name值。

类似:user.get("name")$customer.Address有两种含义。

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

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

正式格式:${customer.Address}3 方法object user.getName() = $user.getName()一个方法就是被定义在java中的一段代码,并且它有完成某些有用工作的能力,例如一个执行计算和判断条件是否成立、满足等。

方法是一个由$开始并跟随VTL标识符组成的References,一般还包括一个前两个例子$customer.getAddress()和$purchase.getTotal()看起来挺想上面的属性$customer.Address 和$purchase.Total。

如果你觉得他们之间有某种联系的话,那你是正确的。

VTL属性可以作为VTL方法的缩写。

$customer.Address属性和使用$customer.getAddress()方法具有相同的效果。

如果可能的话使用属性的方式是比较合理的。

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

正式格式:${purchase.getTotal()}4 Range OperatorRange operator可以被用于与#set和#foreach statement联合使用。

对于处理一个整型数组它是很有用的,2 循环每次循环$list中的一个值都会赋给$element变量。

$list可以是一个Vector、Hashtable或者Array。

分配给$element的值是一个java对象,并且可以通过变量被引用。

例如:如果$element t是一个java的Product 类,并且这个产品的名字可以通过调用他的getName()方法得到。

现在我们假设$list是一个Hashtable,如Velocity默认的名字。

可以通过设置 = velocityCount来改变。

计数从“1”开3 条件语句4 语句的嵌套语句中也可以嵌套其他的语句,如#if…#else…#end等。

5 注释5.1 单行注释:##这是一个注释:定义名字为mike5.2 多行注释:#*Thus begins a multi-line comment. Online visitors won‟t see this text because the Velocity Templating Engine will ignore it.*#5.3 文档格式:#**This is a VTL comment block andmay be used to store such informationas the document author and versioninginformation:@version 1.1@author xiao*#6 关系和逻辑操作符例子中#if() 指令仅在$foo 和$bar都为真的时候才为真。

如果$foo 为假,则表达式也为假;并且$bar 将不被求值(类似C语言)。

如果$foo为真,Velocity 模板引擎将继续检查$bar的值,如果$bar为真,则整个表达式为真。

并且输出This AND that 。

如果$bar为假,将没有输出因为整个表达式为假。

7 Velocity 中的宏Velocity中的宏我们可以理解为函数。

Velocimacros可以在V elocity模板内实现行内定义(inline),也就意味着同一个web site内的其他Velocity模板不可以获得Velocimacros的定义。

定义一个可以被所有模板共享的Velocimacro显然是有很多好处的:它减少了在一大堆模板中重复定义的数量、节省了工作时间、减少了出错的几率、保证了单点修改。

定义模板共享的Velocimacro在velocity.properties中定义,它可以当将一个reference作为参数传递给Velocimacro时,请注意reference作为参数时是以名字的形式传递的。

这就意味着参数的值在每次Velocimacro内执行时才会被产生。

这个特性使得你可以将一个方法调用作为参数传递给Velocimacro,而每次Velocimacro执行时都是通过这个方法调用产生不同的值来执行的。

Velocimacro properties中有关宏的一些配置项:•velocimacro.libraary:一个以逗号分隔的模板库列表。

默认情况下,velocity查找唯一的一个库:VM_global_library.vm。

你可以通过配置这个属性来指定自己的模板库。

•velocimacro.permissions.allow.inline属性:有两个可选的值true或者false,通过它可以确定Velocimacros是否可以被定义在regular template内。

默认值是ture――允许设计者在他们自己的模板中定义Velocimacros。

•velocimacro.permissions.allow.inline.replace.global属性有两个可选值true和false,这个属性允许使用者确定inline的Velocimacro定义是否可以替代全局V elocimacro定义(比如在velocimacro.library 属性中指定的文件内定义的Velocimacro)。

默认情况下,此值为false。

这样就阻止本地Velocimacro 定义覆盖全局定义。

相关主题