5、Velocity学习
5.1 Velocity简介
Velocity是基于JAVA的模板引擎,模板引擎解决了把动态内容插入静态页面的问题。Velocity模板引擎最大的优点是使用了模板缓冲。在模板缓冲机制的作用下,模板不再是每次出现请求的时候从磁盘读取,而是以最理想的方式在内存中保存和解析。在开发期间,模板缓冲通常处于禁用状态,因为这时请求数量较少,而且要求对页面的修改立即产生效果。开发完毕之后,模板一般不再改变,此时就可以启用模板缓冲功能。因此Velocity执行速度明显优于JSP。需要注意的是,使用Velocity时需要页面设计者跟程序开发人员对于页面展示的数据变量名称达成一致,这就要求在系统开发前期需要用更多的时间去做好相应的规范。
5.2 引用
5.2.1 变量定义及赋值
一个VTL 标识符必须以一个字母开始(a .. z或 A .. Z)。剩下的字符将由以下类型的字符组成:
字母 (a .. z, A .. Z)
数字 (0 .. 9)
连字符("-")
下划线 ("_")
实例如下:#set($foo="velocity")
5.2.2 属性
VTL引用的第二种元素是属性,而属性具有独特的格式。属性的简略标记识前导符$后跟一个VTL 标识符,在后跟一个点号(".")最后又是一个VTL 标识符。这是一些有效的示例:
$customer.Address $purchase.Total |
请看第一个例子, $customer.Address.。他有两种意思。它可以意味着,查询由customer标是的哈希表并按关键字Address返回值。但是 $customer.Address 也可能引用一个方法(下述,$customer.Address可能是$customer.getAddress().的缩写。当一个页面被请求时,Velocity 将决定这两种可能到底是哪一个,然后返回相应的值。
5.2.3 方法
方法在JAVA代码中定义,并作一些有用的事情,比如运行一个计算器或者作出一个决定。方法是实际上也是引用,由前导符"$"后跟一个VTL 标识符,后跟一个VTL 方法体(Method Body)。 VTL 方法体由一个VTL 标识符后跟一个左括号,再跟可选的参数列表,最后是右括号。下面是一些有效的方法示例:
$customer.getAddress() $purchase.getTotal() $page.setTitle( "My Home Page" ) $person.setAttributes( ["Strange", "Weird", "Excited"] ) |
5.2.4 形式引用符
引用的简略符号如上所述,但是另外还有一种引用的形式符号,示例如下:
${mudSlinger} ${customer.Address} ${purchase.getTotal()} |
在大多数情况下,我们将使用引用的简略符号,但在一些情况下,也需要使用形式引用符以便正确处理。
假定你正在纸片上构件一个句子,将使用$vice作为句子中名词的词根。我们的目标是允许人们选择词根,然后产生以下两种结果之一:
"Jack is a pyromaniac." 或者 "Jack is a kleptomaniac."。
在这种情况下,使用简略符号是不太充分的。考虑到下面的例子:
Jack is a $vicemaniac. |
这里有个不确定性, Velocity 假定 $vicemaniac,(而不是 $vice)是一个你想要使用的标识符。找不到$vicemaniac的值,他将返回$vicemaniac。使用形式符号便可解决这个问题:
Jack is a ${vice}maniac |
现在Velocity 知道 $vice(而不是 $vicemaniac)是一个引用。形式符号常用在饮用咋模板中和文本直接邻近的地方。
5.2.4 安静引用符
当 Velocity 遇到一个位定义的引用时,其通常行为是输出这个引用的映像。比如,假设下面的引用出现在模板中的一部分:
<input type="text" name="email" value="$email"/> |
当表单初次装入时,变量引用$email无值,你宁愿是一个空白域而不是具有值"$email"。使用安静引用符可以绕过Velocity的常规行为,在VTL中不用$email而是用$!email 符号。所以,上面的例子将会看起来像下面的样子:
<input type="text" name="email" value="$!email"/> |
现在,当表单初次装入时, $email 仍然没有值,但是将输出空字符串而不是"$email"。
形式和安静引用符可以一起使用,如下所示:
<input type="text" name="email" value="$!{email}"/> |
5.3注释
5.3.1单行注释
##
## This is a single line comment.
5.3.2多行注释
以 #* 开始,以 *# 结束
#*
Thusbegins a multi-line comment. Online visitors won't
see thistext because the Velocity Templating Engine will
ignoreit.
*#
5.3.3注释块
#** *#,可以用来存储诸如文档作者、版本信息等。
#**
This is a VTLcomment block and
may be used tostore such information
as thedocument author and versioning
information:
@author
@version 5
*#
5.4 条件语句
5.4.1 If语句
#if($bool)
<strong>Velocity!</strong>
#end
$bool是一个boolean值,有两种情况,为true输出“Velocity!”,为false则
不输出。
5.4.2 If else 语句
#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
5.4.3 关系逻辑操作符
(1) ==:
#if($a==$b)
True
#end
$a和$ b两个值相等返回true
(2) &&:
#if($a && $b)
True
#end
$a和$ b两个值必须都为true才会返回true
(3) ||:
#if($a || $b)
True
#end
$a和$ b两个值只要有一个为true就会返回true
(4) !:
#if(!$a )
True
#end
取反,当$a为true时!$a为false
5.5 循环
#foreach 元素允许进行循环,例如:
<ul> #foreach( $product in $allProducts ) <li>$product</li> #end </ul> |
这个#foreach 循环将导致$allProducts 列表 (对象) 为查询所有的产品$products (目标)遍历一遍。每次经过循环,从$allProducts 取得的值将置于$product 变量之中。
$allProducts 变量的内容是一个矢量,一个哈希表或者数组。赋给$product 变量的值是一个Java 对象并且可以从一个类似的变量引用。例如,如果 $product 真是一个Java的产品类,其名称可以通过引用$product.Name 方法来检索(即: $Product.getName())。
5.6 包含、停止
#include 脚本元素允许模板设计人员包含(导入)本地文件,这个文件将插入到#include 指令被定义的地方。文件的内容并不通过模板引擎来渲染。处于安全的原因,被包含的文件只可以放在TEMPLATE_ROOT下。
#include( "one.txt" ) |
#include 指令引用的文件在双引号内。如果超过一个文件,其间用逗号隔开。
#include( "one.gif","two.txt","three.htm" ) |
被包含的文件并不是一定要用文件名来引用,事实上,最好的办法是使用变量而不是文件名。这在根据规则决定何时提交页面时,决定目标输出是很有用的。
#include( "greetings.txt", $seasonalstock ) |
5.7 解析
#parse 脚本元素允许页面设计员导入包含VTL的本地文件。 Velocity将解析和渲染指定的模板。
#parse( "me.vm" ) |
就象 #include 指令,#parse 可以使用变量而不是一个实在的模板文件。#parse 引用的模板文件必须包含的TEMPLATE_ROOT指定的目录之下。和 #include 指令不一样, #parse 只有一个参数。
5.7 停止
#stop 脚本允许模板设计员停止模板引擎的执行,并返回。这通常用作调试。
#stop |
5.8 宏
5.8.1 定义宏
#macro( tablerows $color $somelist )
#foreach( $something in $somelist )
<tr><tdbgcolor=$color>$something</td></tr>
#end
#end
宏的名字为tablerows,定义了两个参数,$color颜色,$somelist数据集合或数组
5.8.2 调用宏
#set( $greatlakes =["Superior","Michigan","Huron","Erie","Ontario"])
#set( $color = "blue" )
<table>
#tablerows( $color $greatlakes )
</table>
定义$greatlakes数据集合,和$color颜色,调用#tablerows(宏),传入两个参数,会执行宏里的foreach循环
5.9 Velocity在项目中的应用
5.9.1 配置文件位置
项目中velocity的配置文件velocity.properties,所处位置example\example-web\src\main\resources
5.9.2 各配置解释
tools.view.servlet.layout.directory=/WEB-INF/vm/layout/
Layout布局文件的路径
tools.view.servlet.error.template=/WEB-INF/vm/error.vm
错误页
tools.view.servlet.layout.default.template=default.vm
在layout下的默认模板
velocimacro.library=/WEB-INF/vm/macro.vm
宏。里面定义了多个宏方法,在页面上直接调用
input.encoding=gbk
output.encoding=gbk
输入输出字符编码
runtime.log.logsystem.class=org.springframework.ui.velocity.CommonsLoggingLogSystem