什么是 Velocity?
Velocity 是一个基于 java 的模板引擎(template engine). 它可以让视图的设计者在 web 页面中引
用 java 代码中定义的数据对象和命令。从而使 Web designers 和 java 开发者依照 MVC 思想(Model-View-
Controller )开发系统,这意味着 Web designers 只须将精力注用于良好表现力的视图外观设计,而Java
程序员则只要关心着如何写出高效简洁的 java 对象以实现业务逻辑-----Velocity 会将他们组装到一起.
相比传统的 jsp、PHP 等脚本语言,Velocity 彻底的将避免了在视图设计中出现的 java 代码, 从而保证
了 web site 的长期可维护性.
一定要理解,Velocity 是一个 template engine 的意思,它还可以从模板中生成 SQL 语句或其它脚本提
供给 web pages. 它也可以独立使用---做为一个工具类(utility class)用来生成源代码、报表、邮件模
板等---在有需要重复的视图情况下,你应想到使用 Velocity.Apache 站点提供的另外一个框架 Turbine
可以和 Velocity 有效结合以实现 true MVC model.
给Velocity中的变量赋值
举个栗子 我们要定义一个变量a 给a赋值为velocity,那么对应的VTL语法应为
#set( $a = "Velocity" ) 在VTL中 符号# 所跟的 set 我们用“指示符”这一名词来称呼它(随后介绍更多的指示符), set 指示符使用一个表达式(expression) (包含在一对括号里) –将一个值 value (这里是 Velocity)付给变量 a,(变量名
在左边,值在右边,用=组合起来). 变量是 a ,而符号“$”表明它是一个变量,Velocity 中所有变量以符号”$”开头,所
付的值要用双引号括起, 这个值中还可以再添加 Velocity 变量,如"Hello $name",输出的将是 name
变量所付的值
输出第一个velocity页面
<html>
<body>
#set( $foo = "Velocity" )
Hello $foo World!
</body>
<html>
打开上述页面 我们可以看到输出结果为 Hello Velocity World 在此就不贴图了
Velocity中的注释
单行注释 ##
多行注释 #* *#
熟悉开发的童鞋应该都明白使用规则 类似与java中的 // 和/**/ 在此不多赘述
Velocity的引用
VTL中的引用分为三种 变量引用(variables),属性引用(properties)和命令引用(methods)
* 所有的引用都会以字符串的形式来展现 假设某int类型的值 传入模板引擎中 那么在底层会调用toString()方法来对其进行转换
1.变量引用
简单的说变量以"$" 开头,后面跟一个 VTL 指示符( Identifier).一个合法的 VTL 指示符是以字母开头
以下是正确的 VTL 变量名:
$foo
$mudSlinger
$mud-slinger
$mud_slinger
$mudSlinger1
2.属性引用
VTL 的第二种引用,属性引用,注意”属性”具有相对固定的格式. 它也是以$开头的合法 VTL 指示符,随
后是”变量名字.变量属性”. 如下例:
$customer.Address
$purchase.Total
第一个例子 , $customer.Address.我们设想可能在两种意思 .首先它可能在查找 customer 引用的一个
hashtable 中的以“Address”为 key 关联的一个数据对象.另外他可能表示的是 java 对象 customer 中的
getAddress()这个命令取得的结果 (当然也可写成 $customer.getAddress()). 当客户请求 Web 页面中
Velocity 将根据具体的 customer 类型输出.
3.Methods(命令)
在 java 代码中定义命令是最通常的事, 像执得一组方程式计算成本,读取一个文件等. 命令引用和其它
引用一个也是一个一般的 VTL 声明,看如下的例子可能会更快的理解:
$customer.getAddress()
$purchase.getTotal()
$page.setTitle( "My Home Page" )
$person.setAttributes( ["Strange", "Weird", "Excited"] )
属性引用中的属性查找规则
前己提及,属性可以引用到对象的命令. Velocity 会使用合适的策略选择引用到的命令. 它会根据协定
的命令命令格式查找. 无论属性引用的的名字是否大小写,Velocity 都有固定的查找规则.如在
$customer.address 引用时,查找顺序是:
1.getaddress()
2.getAddress()
3.get("address")
4.isAddress()
对于VTL中大写的属性名 Address 引用,将是:
1.getAddress()
2.getaddress()
3.get("Address")
4.isAddress()
总结起来就是 VTL语法中 引用类型值的查找会优先匹配名称完全一致的,然后是驼峰式起名,之后是获取名称完全一致的字符串
以上均为简洁格式的引用 但是在实际开发中 容易出现变量名混淆的时候,所以一般会将变量名称以大括号包裹,例如获取一个名为kobe的变量 即${kobe} 这样就可以避免与其他名称联系导致名称混淆
注意:模板中引用的必须是通过 java Bean 中的 getter/setter 实现的,而直接的 java 对象的数据域是
不能直接引用的,如$foo.Name 会解析到 class Foo's getName() 的实例方法,但不会解析到 Foos 类的
public Name 这个实例变量
Quiet Reference Notation(静态引用输出)
Velocity 遇到一个不能处理的引用时,一般他会直接输出这个引用$email 的写法,页面上会看到的是
$email,如下例,我们可以在$后面加上一个!号,那么就会输出空白:.
<input type="text" name="email" value="$email"/>
<input type="text" name="email" value="$!email"/>
正式的写法是:.
<input type="text" name="email" value="$!{email}"/>
Directives(指令符号)
模板设计者使用“引用“生成动态内容, 指令(directives) – 简单的说就是设计者在模板中操作 java对象—让视图设计者全面控制输出内容的格式.
指令总是以 #开头后面紧跟具体的指令符. 就像引用一样(指令的一种),可以将指令理解为”表示这里是一个什么东东).如下例生成一个出错提示:
#if($a==1)true enough#elseno way!#end
这个例子中应使用括号将 else 分开.
#if($a==1)true enough#{else}no way!#end
Conditionals(条件判断)
1.If / ElseIf / Else
#if 指令用来根据条件在页面中输出内容,, 如下简单的例子::
#if( $foo )
<strong>Velocity!</strong>
#end
根据变量 $foo 计算后是否为 true 决定输出,, 这会有两种情况:: (i) $foo 的是
值是一个 boolean (true/false)
(true/false)型并有一个 true value, 或 (ii) 它是一个非null值
Velocity context 中只能包含 Objects, 因此当我们讲
'boolean'时,, 它就是一个 Boolean (the class).
velocity中的== 与java中有所不同 不能用来测试对象是否相等(( 指向同一块内存)) . Velocity 中是否相等仅直接的用来比较 numbers, strings 的值,, or objects 的 toString()结果是否相等.. 如果是不同的对象,, 会调用它们的toString()命令结果来比较..