标签归档:Velocity

eclipse velocity语法高亮

eclipse里面使用velocity的.vm文件确实是很难受的一件事情,IDEA里面用不存在这个问题,最直接的方法就是用htm编辑器打开,插件尝试装了好几个,没有满意的还是设置htm编辑器打开吧。

eclipse *.vm 文件,语法高亮:
设置文件打开时使用的编辑器

[code]
General>>Editors>>File Associations

General>>Content Types,选择Text>>Html

[/code]

点击Add,输入*.vm,保存。

velocity 数组操作

常用方法:

$myarray.isEmpty()数组是否为空
$myarray.size()获取数组元素个数
$myarray.get(2)获取数组指定下标的元素
$myarray.add()增加元素

数组 & 访问

Velocity 访问数组对象,无法通过类似 arr[2] 来访问特定位置的元素。

#set($arr = [0, 1, 2, 3])
$arr.get(2)
注:Velocity 中的数组对应 Java 中的 List 对象。对于 Java 原生 Array 对象, 只能够 #foreach 进行遍历,无法使用 $arr[0] 和 $arr.get(0) 方法。

范围(range)
#foreach($item in [10..20])
$item
#end
对象 & 访问
#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 中元素的定义顺序 (据目前所知,是根据键的字母排序的)。

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

I:
#set($obj = [
{“key”:”key”, “value”:”value”},
{“key”:”name”, “value”:”space”}
])
#foreach($item in $obj)
$item.key : $item.value
#end
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

更多资料内容可参看:

http://wiki.hotoo.me/Velocity-Notes.html
http://wiki.hotoo.me/Velocity.html

Velocity语法参考

1.1.Velocity语法参考

1.1.1.表达式
² 访问JavaBeans
$someBean或${someBean}

² 读Properties
$bean.name或${bean.name} ## 访问bean.getName()方法或是$bean.get(“name”)方法

² 写Properties
#set ($bean.name = “value”)
或#set (${bean.name} = “value”) ## 访问bean.setName(“value”)方法

² 调用方法
$uri.setTarget(“target.vm”)

1.1.2.注释
² 行注释
## line comments

² 块注释
#* block
comments
*#

² 文档注释
#** document
comments
*#

1.1.3.循环
² 循环语句:
#foreach ($item in $collection)
($velocityCount) item is $item
#end

² 其中velocityCount是一特殊循环变量,用来指出循环的次数(1-based)

1.1.4.条件判断
² 条件判断
#if ($order.total == 0)
No charge
#else
$order.total
#end

1.1.5.赋值
² 赋值
#set ($customer = $order.customer)

² 四则运算
#set ($sum = $num1 + $num2)
#set ($sub = $num1 – $num2)
#set ($mul = $num1 * $num2)
#set ($div = $num1 / $num2)
#set ($mod = $num1 % $num2)

1.1.6.调试
² 暂停执行
#if ($debug) #stop #end

² 调试表达式
$user ## 显示user.toString()
$user.class ## 显示user.getClass()
$user.name ## 显示user.getName().toString()
$user.name.class ## 显示user.getName().getClass()

1.1.7.宏
² 定义宏
#macro ( errorMessage $field )
#if ( !$field.valid )
<div class=”formError”>* $field.message</div>
#end
#end

² 使用宏
<td>#errorMessage ( $group.lastName )</td>

1.1.8.判断空
² 判断:$bean不为null或Boolean.TRUE
#if ($bean) … #end

² 判断字符串空:””或null
#if ($stringUtil.isEmpty($str)) … #end

² 判断字符串非空:非””和null
#if ($stringUtil.isNotEmpty($str)) … #end

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模型进行开发。

常用指令:
1、”#”用来标识Velocity的脚本语句。
2. “$”用来标识一个对象(或理解为变量);
3. “{}”用来明确标识Velocity变量,和普通模版字符串区分开来;
4. “!”强制把不存在的变量显示为空白;
5. 语句注释:单行注释:## 单行注释代码,多行注释:#* 多行注释代码 *#
6. 模版支持关系和逻辑操作符运算,如:&&、||、! 等
7. 宏定义:#macro ;
8. 终止命令:#stop,停止执行模板引擎并返回。
9. 引入公共模版文件#include与#parse;
10. 转义字符’\’;
11. Velocity内置了一部分java对象 如:$request、$response、$session等,在vm模版里可以直接调用。
常用指令#set、#if 、#else、#foreach、#end、#include、#parse、#macro等。
引入模板:#include与#parse,它们的差异是:#parse只能指定单个对象。而#include可以有多个,#include被引入文件的内容将不会通过模板引擎解析;而#parse引入的文件内容Velocity将解析其中的velocity语法并移交给模板,意思就是说相当与把引入的文件copy到文件中。#parse是可以递归调用的。

注意:
Velocity是大小写敏感的;
变量输出要带上静止修饰符,避免模板直接空指针报错
举例 :$var错误,$!var正确
如果变量referce与html一起使用,需要在变量名上加上{};{}标识Velocity变量的内容需要注意空格;
宏定义#macro 需要先定义再调用;
#foreach中的index($velocityCount)从1开始;
Velocity中的相减之间要有空格;
Velocity中是否相等仅直接的用来比较numbers, strings的值, or objects的toString()结果是否相等. 如果是不同的对象,会调用它们的toString()命令结果来比较.