Velocity2

在js中调用Velocity 模板中的变量。不能调用对象和数组,可以调用对象中的某一个值(这个值不能是数组或对象。只能是字符或者数字)

 

Velocity是什么一个java的后端模板引擎,后缀名是.vm

常用指令:

"#"用来标识Velocity的脚本语句,包括#set、#if 、#else、#end、#foreach、#end、#iinclude、#parse、#macro等;

如:

    #if($info.imgs)

        <img src="$info.imgs" border=0>

    #else

        <img src="noPhoto.jpg">

#end

 

 


#if($foo<10)

<strong>Go North</strong>

#elseif($foo==10)

<strong>Go East</strong>

#elseif($bar==6)

<strong>Go South</strong>

#else

<strong>Go West</strong>

#end

 

$"用来标识一个对象(或理解为变量);
    如:$i、$msg、$TagUtil.options(...)等

 

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

如当页面中包含$msg,如果msg对象有值,将显示msg的值,如果不存在msg对象同,则在页面中将显示$msg字符。这是我们不希望的,为了把不存在的变量或变量值为null的对象显示为空白,则只需要在变量名前加一个“!”号即可。

当使用!时表示当此变量值为空时,显示空字符串。比如当$article为空,那会显示“$article“,而$!article会显示为“”

如:$!Msg

 

在模板中设置变量:#set( $a = "Velocity" )

 

变量和字符串如何拼接: 例: <span>${obj.name}我是大晴</span>

 

对象调用方法: 例如:$article.GetListByTitle('nvelocity')或${article.GetListByTitle('nvelocity')}。其实对对象的属性值也可以用$article.get_Title()获得。

 

循环语法:

#foreach( $info in $list) $info.someList #end  循环读取集合list中的对象,并作相应的处理。

如:EasyJF开源论坛系统中论(0.3)坛首页显示热门主题的html界面模板脚本:

#foreach( $info in $hotList1)

<a href="/bbsdoc.ejf?easyJWebCommand=show&&cid=$!info.cid" target="_blank">$!info.title</a><br>

#end

上面的脚本表示循环遍历hotList1集合中的对象,并输出对象的相关内容。

Velocity(7)——#foreach指令

首先是#foreach的简单示例:

#foreach( $elem in $allElems)
    $elem</br>
#end

上面这个例子中,$allElems可以是一个Vector,一个HashTable,一个数组。

在Velocity中,有一个变量$velocityCount用作循环计数,初始值是1。这个变量的名字和初始值是在velocity.properties文件里配置的。

 

 

$velocityCount 

这个变量在velocity属性文件中定义,在#foreach的时候可以用得上,比如我foreach一个List<User>时,我们可以使用$velocityCount判断完成形如“张三,李四”的输出(李四后面没有逗号) 

Java代码  

1. #foreach($user in $users)  

2.     #userNode($user)#if($velocityCount != $user.size()),#end   

3. #end  



或 

Java代码  

1.  #foreach($user in $users)  

2.      #if($velocityCount != 1),#end #userNode($user)  

3.  #end  


默认$velocityCount 从1开始。 

#Parse

#Parse用来在当前模板中引入并执行另一个(本地的)模板——可以是静态的,也可以是动态的——并把结果嵌入到当前位置。#Parse()指令的参数,可以是一个双引号括起来的文件名,也可以是一个变量,但是它不能接受多个参数。

被#Parse引入的文件仍然可以使用#Parse指令。在velocity.properties文件中有一个属性directive.parse.max.depth,默认值是10,它指定了#Parse嵌套的最大层次。既然#Parse嵌套是允许的,#Parse递归也是允许的。

假如a.vm #Parse b.vm,那么a.vm中定义的变量vb.vm中可以随便使用。如果b.vm也定义了v,在b.vm中可以随便使用。如果b.vm也定义了v,那么b.vm中用到的将会是自己的v,而不是a.vm中的v,而不是a.vm中的v。

 

包含文件#inclue("模板文件名")或#parse("模板文件名")

  主要用于处理具有相同内容的页面,比如每个网站的顶部或尾部内容。

  使用方法,可以参考EasyJF开源Blog及EasyJF开源论坛中的应用!

  如:#parse("/blog/top.html")或#include("/blog/top.html")

parse与include的区别在于,若包含的文件中有Velocity脚本标签,将会进一步解析,而include将原样显示。

注释:

velocity的注释是用多个#号来标识的,大段注释用 #* 和 *#包起来
单行注释:##注释内容
多行注释:
#*
注释内容
*#

宏调用

macro指令让模板设计者可以将些重复、相关的的脚本版断定义为一个功能块.

这是一个独立的vm模板

a.vm内容片段
#macro( tablerows $color $somelist )

#foreach( $something in $somelist )

    <tr><td bgcolor=$color>$something</td></tr>

#end

 

在b.vm中调用

b.vm中的内容片段

1.引入a.vm

2.

#set( $greatlakes = ["Superior","Michigan","Huron","Erie","Ontario"] )

#set( $color = "blue" )

<table>

    #tablerows( $color $greatlakes )

</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>

如果将宏#tablerows($color $list) 定义到一个模板库中(Velocimacros template library), 其它模板就都可以访问它了.

尽量不要直接在模板中使用#parse() 包含#macro() 指令.因为#parse() 动作在运行时执行,时会有一个在VM 中查找元素的过程.

 

项目中注意点:

数组如何变量获取值

#set($index = 0) -- 声明一个变量

 

#set($keyName =$jobsAndTriggers.groups[$index])    --  $jobsAndTriggers.groups是一个数组获取第$index的值。再赋值给$keyName

 

 

${keyName} -- 这是个字符串的输出--可直接输出到浏览器上

 

切记: js中无法直接获取velocity设置的对象和数组。只能获取对象中具体的值(字符串或数值)。单独的js文件不能用velocity任何变量

 

在js中的操作:

  1. 获取数组中某一个具体的值:"${jobsAndTriggers.groups[0]}"

 

数组$jobsAndTriggers.groups 是个数组在js中调用时,

如果是组中的元素是字符---必须将数组中的内容转化成字符串才能取到。所以必须用"${jobsAndTriggers.groups[0]}"这种形式才能获取到具体的值

 

如果数组中的元素是整数,则直接获用$jobsAndTriggers.groups[0]可能会可以。这个我没试过

注意:

Html中声明一个$dd

 

在js中这么写是会报错的:

 

也就是说不要将$dd赋值给一个js变量。再去和其他的velocity变量去组合。这是不对的

 

  1. 再html 中声明,在js中调用

 

 

 <script>

   var index = ${index}

   console.log(index)

 </script>

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值