[转]vm常用语法
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模型进行开发。
一、 变量
$ [ ! ][ { ][ a-z, A-Z ][ a-z, A-Z, 0-9, -, _ ][ } ]
例如:
* 一般格式: $ued-yuanxin_20
* 静态引用: $!ued-yuanxin_20
* 正规格式: ${ued-yuanxin_20}
注:对于静态引用符——叹号(!)。如果一个变量没有赋值(如:value=”$yuanxin”),则会直接原样输出变量名,没有任何处理(输 出:value=”$yuanxin”)。使用静态引用符,将会在代码初始化时,如变量没有值,输出一个空字符串代替变量(输出value=”")。
二、属性
$ [ { ][ a-z, A-Z ][ a-z, A-Z, 0-9, -, _ ]* .[a-z, A-Z ][ a-z, A-Z, 0-9, -, _ ]* [ } ]
具有相对固定的格式,它以 $ 开头,随后是“变量名字.变量属性”。
例如:
* 一般格式: $customer.address
* 正规格式: ${ customer.address }
$customer.address,首先它可能在查找customer引用的一个hash表中的以“address”为key关联的一个数据对 象。也可能表示java对象customer中的getAddress()这个命令取得的结果(当然也可写成 $customer.getAddress())。当客户请求Web页面,将根据具体的customer类型输出。
三、方法
$ [ { ][ a-z, A-Z ][ a-z, A-Z, 0-9, -, _ ]* .[ a-z, A-Z ][ a-z, A..Z, 0-9, -, _ ]*( [ optional parameter list ] ) [ } ]
例如:
* 一般格式: $customer.getAddress()
* 正规格式: ${ customer.getAddress() }
* 传入参数: $customer.getAddress(”taobao ued”)
$customer.getAddress() 可以等同于属性引用情况: $customer.address,同时,也等同java对象coustomer的getAddress()方法调用。
四、指令
1、set指定——建立变量对值的引用
# [ { ] set [ } ] ( $ref = [ ", ' ]arg[ ", ' ] )
#set 用来给一个引用赋值,值可以被赋给变量引用或属性引用, 但要将它们放入括号中。而右值可以为变量引用、字符串、属性引用、方法引用、数字、数组、映射(Map),甚至可以做为一个表达式出现(加,减,乘,除和取模等)。
例如:
* 变量引用: #set( $monkey = $bill )
* 字符串引用: #set( $monkey.friend = “monica” )
* 属性引用: #set( $monkey.blame = $whitehouse.Leak )
* 方法引用: #set( $monkey.plan = $spindoctor.weave($web))
* 数字引用: #set( $monkey.number = 123 )
* 数组引用: #set( $monkey.say = ["Not", $my, "fault"] )
* 映射引用: #set( $monkey.map = {”banana” : “good”, “roast beef” : “bad”})
在ArrayList类型引用的例子中,其原素定义在数组 [..]中, 因此,你可以使表 $monkey.say.get(0)访问第一个元素.
类似的,引用Map 的例子中, 原素定义在 { } 中,其键和值间以:隔成一对,使用 $monkey.map.get(”bannana”) 在上例中将返回 ‘good’, ( $monkey.map.banana也会有同样效果)。
注意:使用#set 指令默认情况下,变量如果用 “”引起会被解析,但当用单引号引起来时,就不会被解析。但淘宝的VM已经修改了此规则,双引号和单引号都解析,但依旧不推荐使用单引号。
2、#if/#elseif/#else——条件判断
# [ { ] if [ } ] ( [condition] ) [output] [ # [ { ] elseif [ } ] ( [condition] ) [output] ]* [ # [ { ] else [ } ] [output] ] # [ { ] end [ } ]
* condition – 如果是boolean型,根据true或false决定,否则非null时认为是true。
* output –可以包含VTL的输出内容。
* 关系和逻辑运算基本同JS。
* “== ” 操作符可以用来比较数字,字符串,或同一个类的不同对象或不同类型的对象. 当是不同类的对象时,会调用它们的toString()命令结果来做比较看是否相等。
* 也可以如下用法,但注意else处,用{}括起:#if( $foo == $bar)it’s true!#{else}it’s not!#end
3、#foreach—使用循环通过列表迭代对象
# [ { ] foreach [ } ] ( $ref in arg ) statement # [ { ] end [ } ]
* $ref:引用的要迭代的对象.
* arg:可能是一个列表引用、数组列表、或其它列表。
例如:
* 列表引用: #foreach ( $item in $items )
* 数组列表: #foreach ( $item in ["Not", $my, "fault"] )
* 根据设定的界限: #foreach ( $item in [1..3] )
五、注释
单行注释(##),例如:
## This is a comment.
多行注释(#^ xxxx ^#),例如:
#*
This is a multiline comment.
This is the second line
*#
六、转义
$ 和 # 是VM中的特殊字符,转义需使用反斜杠(),例如:$email
七、其他
1、 $ 和 # 是VM中的特殊字符,所以禁止在VM中使用Tbar中的 $D或者 $E等变量。
2、判断变量值时,需要对变量加引号,强制转型为String型(例如:#if (”$listType” == “grid”) )。
3、字符串使用引号时,约定优先使用双引号。
八、淘宝VM常用语法
1、引用control语法:$control.setTemplate(”list/product/catPathLink.vm”)
2、layout中引用screen 语法:$screen_placeholder 。
3、获得url问好后的参数,例如:获得”?list=xxx”,使用方法:$rundata.parameters.getString(”list”)
?