Velocity是⼀个基于java的模板引擎(template engine)。它允许任何⼈仅仅简单的使⽤模板语⾔(template language)来引⽤由java代码定义的对象。 当Velocity应⽤于web开发时,界⾯设计⼈员可以和java程序开发⼈员同步开发⼀个遵循MVC架构的web站点,也就是说,页⾯设计⼈员可以只 关注页⾯的显⽰效果,⽽由java程序开发⼈员关注业务逻辑编码。Velocity将java代码从web页⾯中分离出来,这样为web站点的长期维护提 供了便利,同时也为我们在JSP和PHP之外⼜提供了⼀种可选的⽅案。⼀、Velocity脚本语法摘要1. 变量
(1)变量的定义:
#set($name = \"hello\") 说明:velocity中变量是弱类型的。
当使⽤#set 指令时,括在双引号中的字⾯字符串将解析和重新解释,如下所⽰:#set($directoryRoot = \"www\" )#set($templateName = \"index.vm\" )
#set($template = \"$directoryRoot/$templateName\" )$template
输出将会是:www/index.vm
注:在velocity中使⽤$2.5这样的货币标识是没有问题得的,因为velocity中的变量总是以⼀个⼤写或者⼩写的字母开始的。(2)变量规范的写法
${name} ,也可以写成:$name。提倡⽤前⾯的写法。例如:你希望通过⼀个变量$vice来动态的组织⼀个字符串。 Jack is a $vicemaniac.
本来变量是$vice现在却变成了$vicemaniac,这样Veloctiy就不知道您到底要什么了。所以,应该使⽤规范的格式书写 : Jack is a ${vice}maniac现在Velocity知道变量是$vice⽽不是$vicemaniac。注意:当引⽤属性的时候不能加{}(3)变量的赋值: $name=\"hello\"
赋值的左边必须是⼀个变量或者是属性引⽤。右边可以是下⾯六种类型之⼀: 变量引⽤,字⾯字符串,属性引⽤,⽅法引⽤,字⾯数字,数组列表。下⾯的例⼦演⽰了上述的每种类型:#set( $monkey = $bill ) ## variable reference#set( $monkey.Friend = \"monica\" ) ## string
#set( $monkey.Blame = $whitehouse.Leak ) ## property reference#set( $monkey.Plan = $spindoctor.weave($web) ) ## method reference#set( $monkey.Number = 123 ) ##number
#set( $monkey.Say = [\"Not\
注意:①如果上述例⼦中的右值是null, 则左值不会被赋值,也就是说会保留以前的值。②velocity模板中未被定义的变量将被认为是⼀个字符串。例如:#set($foo = \"gibbous\")$moon = $foo
输出结果为:$moon = gibbous
③velocity模板中不会将reference解释为对象的实例变量。例如:$foo.Name将被解释为Foo对象的getName()⽅法,⽽不是Foo对象的Name实例变量。例如:$foo.getBar() 等同于$foo.Bar ;
$data.getUser(\"jon\") 等同于$data.User(\"jon\") ;data.getRequest().getServerName() 等同于
$data.Request.ServerName等同于${data.Request.ServerName}2. 循环
#foreach ($element in $list)This is $element. $velocityCount #end例⼦:
#set( $list = [\"pine\#foreach ($element in $list)$velocityCountThis is $element.#end
输出的结果为:1 This is pine.2 This is oak.3 This is maple.
每次循环$list中的⼀个值都会赋给$element变量。
$list可以是⼀个Vector、Hashtable或者Array。分配给$element的值是⼀个java对象,并且可以通过变量被引⽤。例如:如果$element t是⼀个java的Product类,并且这个产品的名字可以通过调⽤他的getName()⽅法得到。#foreach ( $key in $list.keySet())Key: $key -> Value: $list.get($key)
#end
提⽰:velocity中⼤⼩写敏感。
Velocity还特别提供了得到循环次数的⽅法,$velocityCount变量的名字是Velocity默认的名字。 例⼦:First example:
#foreach ( $foo in [1..5] ) $foo #end
Second example:#foreach ( $bar in [2..-2] )
$bar #end
Third example:#set ( $arr = [0..1] ) #foreach ( $i in $arr ) $i #end
上⾯三个例⼦的输出结果为: First example: 1 2 3 4 5
Second example: 2 1 0 -1 -2Third example: 0 13. 条件语句#if (condition)#elseif (condition)#else #end4. 语句的嵌套
#foreach ($element in $list) ## inner foreach 内循环#foreach ($element in $list)
This is $element. $velocityCount
inner
#end
## inner foreach 内循环结束 ## outer foreachThis is $element.
$velocityCount
outer
#end
语句中也可以嵌套其他的语句,如#if…#else…#end等。5. 注释(1)单⾏注释:
## This is a single line comment.(2)多⾏注释:#*
Thus begins a multi-line comment. Online visitors won’t see this text because the Velocity Templating Engine will
ignore it. *#(3)⽂档格式:#**
This is a VTL comment block and may be used to store such information as the document author and versioninginformation:@version 1.1@author xiao*#
6. 关系和逻辑操作符
Velocity 也具有逻辑AND, OR 和 NOT 操作符。如
## example for AND
#if($foo && $bar)This and that#end
例⼦中#if() 指令仅在$foo 和$bar ⽃为真的时候才为真。如果$foo 为假,则表达式也为假;并且 $bar 将不被求值。如果 $foo 为真,Velocity 模板引擎将继续检查$bar的值,如果 $bar 为真,则整个表达式为真。并且输出This AND that 。如果 $bar 为假,将没有输出因为整个表达式为假。7.Velocity 中的宏
Velocity中的宏我们可以理解为函数。①宏的定义
#macro(宏的名称 $参数1 $参数2 …) 语句体(即函数体)#end②宏的调⽤
#宏的名称($参数1 $参数2 …) 说明:参数之间⽤空格隔开。8.#stop
停⽌执⾏模板引擎并返回,把它应⽤于debug是很有帮助的。9.#include与#parse
#include和#parse的作⽤都是引⼊本地⽂件, 为了安全的原因,被引⼊的本地⽂件只能在TEMPLATE_ROOT⽬录下。区别:
(1) 与#include不同的是,#parse只能指定单个对象。⽽#include可以有多个如果您需要引⼊多个⽂件,可以⽤逗号分隔就⾏:#include (\"one.gif\
在括号内可以是⽂件名,但是更多的时候是使⽤变量的:
#include ( “greetings.txt”, $seasonalstock )
(2) #include被引⼊⽂件的内容将不会通过模板引擎解析;
⽽#parse引⼊的⽂件内容Velocity将解析其中的velocity语法并移交给模板,意思就是说相当与把引⼊的⽂件copy到⽂件中。
#parse是可以递归调⽤的,例如:如果dofoo.vm包含如下⾏:Count down.
#set ($count = 8)
#parse (\"parsefoo.vm\")
All done with dofoo.vm!
那么在parsefoo.vm模板中,你可以包含如下VTL:$count
#set($count = $count - 1)#if ( $count > 0 )
#parse( \"parsefoo.vm\" )#else
All done with parsefoo.vm!#end的显⽰结果为:Count down.8763210
All done with parsefoo.vm!All done with dofoo.vm!
注意:在vm中使⽤#parse来嵌套另外⼀个vm时的变量共享问题。如:->a.vm ⾥嵌套 b.vm;
->a.vm ⾥定义了变量 $param;
->b.vm ⾥可以直接使⽤$param,⽆任何。
但需要特别注意的是,如果b.vm⾥同时定义有变量$param,则b.vm⾥将使⽤b.vm⾥定义的值。10.转义字符'\\'的使⽤
如果reference被定义,两个’\\’意味着输出⼀个’\\’,如果未被定义,刚按原样输出。如:
#set($email = \"foo\" )$email\\$emai
l\\\\$email输出:foo$email\\foo\\$email
如果$email 未定义$email\\$email输出:$email\\$email
11.内置对象
Velocity内置了⼀些对象,在vm模版⾥可以直接调⽤,列举如下:
$request、$response、$session,另外,模板内还可以使⽤ $msg内的消息⼯具访问 Struts 的国际化资源,达到简便实现国际化的⽅法。12. 数组访问
对数组的访问在Velocity中存在问题,因为Velocity只能访问对象的⽅法,⽽数组⼜是⼀个特殊的Array,所以虽然数组可以进⾏循环列举,但却不能定位访问特定位置的元素,如 strs[2],数组对固定位置元素的访问调⽤了Array的反射⽅法get(Object array, int index),⽽Velocity没能提供这样的访问,所以数组要么改成List等其他类容器的⽅式来包装,要么就通过公⽤Util类的⽅式来提供,传⼊数组对象和要访问的位置参数,从⽽达到返回所需值的⽬的。
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- pqdy.cn 版权所有 赣ICP备2024042791号-6
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务