注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

SunOfMay的博客

At.163

 
 
 

日志

 
 

Velocity 进阶(转载)  

2013-10-28 13:51:48|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

原文链接
Velocity文档(2)http://my.oschina.net/aiguozhe/blog/39556
Velocity文档(1)http://my.oschina.net/aiguozhe/blog/39553

Velocity的 宏(#macro) 
#macro指令用于定义Velocity的宏。 宏可以定义一段可重用的VTL template。例如: 

1 #macro ( d )
2  <tr><td></td></tr>
3  #end

 上面的例子中定义了一个Velocity的宏, 然后你可以这样来使用它: 
1 #d()

当你的template被调用时,Velocity将用<tr><td></td></tr>替换为#d()。 

        每个Velocity的宏可以拥有任意数量的参数。虽然定义时可以随意设置参数数量,但是调用这个Velocimacro时必须指定正确的参数。下面是一个拥有两个参数的宏,其中一个参数是color,另一个参数是array:

01 #macro ( tablerows $color $somelist )
02   #foreach ( $something in $somelist )
03     <tr><td bgcolor=$color>$something</td</tr>
04 #end 
05   
06 #set ( $greatlakes = [ “Superior”, “Michigan”, “Huron”, “Erie”, “Ontario” ] )
07 #set ( $color = “blue” )
08 <table>
09     #tablerows( $color $greatlakes )
10 </table>

渲染后: 
  <table> 
    <tr><td bgcolor=” blue”> Superior </td></tr> 
    <tr><td bgcolor=” blue”> Michigan </td></tr> 
    <tr><td bgcolor=” blue”> Huron </td></tr> 
    <tr><td bgcolor=” blue”> Erie </td></tr> 
    <tr><td bgcolor=” blue”> Ontario </td></tr> 
  </table> 

       Velocity的宏可以在Velocity模板内实现行内定义(inline)。 这就意味着同一个website内的其他Velocity模板不可以获得该宏的定义。
        定义一个可以被所有模板共享的Velocimacro显然是有很多好处的:它减少了在一大堆模板中重复定义的数量、节省了工作时间、减少了出错的几率、保证了单点修改。
        实际上,上面定义的#tablerows( $color $list ) 宏已被定义在Velocity宏模板库(在velocity.properties中定义)里,所以macro可以在任何规范的模板中被直接调用。 

        Velocity的宏可以使用以下任何元素作为参数:

  • 任何以$开头的reference
  • 字符串字面值(String literal)
  • 数字字面值(Number literal)
  • 整数范围(IntegerRange):[1….3] , [$foo….$bar]
  • 数组列表(Array List):[“a”,”b”,”c”]
  • 布尔字面值(Boolean Literal):true、false
        当将一个reference作为参数传递给Velocity macro时,请注意reference作为参数时是以名字的形式传递的。这就意味着参数的值在每次Velocity macro内执行时才会被产生(相当于某些个特性使得你可以将一个方法调用作为参数传递给Velocimacro,而每次Velocimacro执行时都是通过这个方法调用产生不同的值来执行的。例如: 
1 #macro ( callme $a )
2   $a $a $a
3 #end
4 #callme( $foo.bar() )

执行的结果是:reference $foo的bar()方法被执行了三次。 如果你不需要这样的特性, 可以通过以下方法: 
1 #set ( $myval = $foo.bar() )
2 #callme ( $myval )

又一篇, 原文链接 http://wiki.hotoo.me/Velocity-Notes.html

对象 & 访问

#set($obj = {"key":"value", "name":"space"}) $obj.get("key")  #foreach(#item in $obj)     $item #end  

上面的 $item 取到的是 values,如果需要在遍历对象过程中,同时取到对象的 keys, 可以使用 entrySet()  keySet() 方法。

#foreach($item in $!obj.entrySet())
    $!item.key : $!item.value
#end

#foreach($item in $obj.keySet())
    $item : $obj.get($item)
#end

注: 这种集合的遍历是无序的,即遍历顺序可能不同于 $obj 中元素的定义顺序 (据目前所知,是根据键的字母排序的)。

另外有两种不完美解决方法:

  1. I:
    #set($obj = [
        {"key":"key", "value":"value"},
        {"key":"name", "value":"space"}
        ])
    #foreach($item in $obj)
        $item.key : $item.value
    #end
    
  2. II:
    #set($obj = [
        ["key","value"],
        ["name","space"]
        ])
    #foreach($item in $obj)
        $item.get(0) : $item.get(1)
    #end
    

之所以说 不完美 是因为:对于已知的 key,本可以直接

$obj.get("key")

现在只能遍历并进行比较取得,而且较早的 Velocity 版本无法使用 #break, 以便在找到匹配项之后立即退出循环。

#foreach($item in $obj)
    #if("key" == $!obj.get(0))
        #set($myKey = $!type.get(1))
        ##break
    #end
#end

 

  评论这张
 
阅读(87)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018