Velocity的中文指南(2)-整理
2004-10-12 10:13
176 查看
1. 取得语义Getting literal
VTL 特别的字符,比如$ 和 #, 来做这个工作,因此在模板中使用这些自负的时候必须格外小心。本节讲述$ 的转义。1.1. 货币
我们写下句子 "I bought a 4 lb. sack of potatoes at the farmer's market for only $2.50!" ,这并没有什么问题。但如前所述,VTL标识符总是以大写或是小写字母开始,所以$2.50 在引用中将不能出错。1.2. 转义有效的VTL 引用
问题将会出现,因为Velocity 将有一个潜在的冲突。转义特殊字符是处理VTL模板种特殊字符的最好的办法,者可以用一个反斜线来进行。foo /foo |
假设$email 是定义了的(比如,具有值foo),但是你想输出 $email。可以有几种方法来做这个事情,不是最简单的是使用转义符。
## The following line defines $email in this template: #set( $email = "foo" ) |
foo /foo |
$email |
$email |
#set( $foo = "gibbous" ) $moon = $foo |
-- 这里 $moon 作为字面输出,因为他并没有定义。而gibbous 将在$foo 的位置输出。
我们也可以转义VTL 指令,这将在指令一节祥述。
2. Case Substitution
现在你大致了解了引用,可以在模板中使用它们了。Velocity 采用了很多JAVA原理的优点,模板设计人员会发现非常容易使用。例如:$foo $foo.getBar() ## is the same as $foo.Bar $data.getUser("jon") ## is the same as $data.User("jon") $data.getRequest().getServerName() ## is the same as $data.Request.ServerName ## is the same as ${data.Request.ServerName} |
Velocity, 建模在Sun Microsystems定义的BEAN规范之上,是大小写敏感的;开发者努力捕捉和纠正可能出现的用户错误。当方法getFoo() 在模板中通过$bar.foo引用时,Velocity 首先尝试$getfoo。如果失败,他会再尝试 $getFoo。类似地,当一个模板引用到 $bar.Foo, Velocity 将尝试 $getFoo() 先,然后尝试 getfoo()。
注意: 模板中引用示例变量的问题仍然没有解决。 只有引用等价于JavaBean的 getter/setter 方法解决了。(比如 $foo.Name 解决了到类 Foo的 getName() 示例方法的引用,但不能引用Foo的一个公共实例变量Name)。
3. 指令
因为指令(使用脚本来有效操控JAVA代码的输出)允许页面设计员真正专注于咱点的外观和内容设计,引用允许模板设计员为Web页面产生动态内容。3.1. #set
#set 指令用来为引用设置相应的值。值可以被值派给变量引用或者是属性引用,而且赋值要在括号里括起来。#set( $primate = "monkey" ) #set( $customer.Behavior = $primate ) |
变量引用
字面字符串
属性引用
方法引用
字面数字
数组列表
这些例子演示了上述的每种类型:
#set( $monkey = $bill ) ## variable reference #set( $monkey.Friend = "monica" ) ## string literal #set( $monkey.Blame = $whitehouse.Leak ) ## property reference #set( $monkey.Plan = $spindoctor.weave($web) ) ## method reference #set( $monkey.Number = 123 ) ##number literal #set( $monkey.Say = ["Not", $my, "fault"] ) ## ArrayList |
右边也可以是一个简单的算术表达式:
#set( $value = $foo + 1 ) #set( $value = $bar - 1 ) #set( $value = $foo * $bar ) #set( $value = $foo / $bar ) |
#set( $result = $query.criteria("name") ) The result of the first query is $result #set( $result = $query.criteria("address") ) The result of the second query is $result |
The result of the first query is bill The result of the second query is bill |
#set( $criteria = ["name", "address"] ) #foreach( $criterion in $criteria ) #set( $result = $query.criteria($criterion) ) #if( $result ) Query was successful #end #end |
我们对此的解决方法是预设$result 为 false。 然后如果 $query.criteria() 调用失败,你就可以检查之。
#set( $criteria = ["name", "address"] ) #foreach( $criterion in $criteria ) #set( $result = false ) #set( $result = $query.criteria($criterion) ) #if( $result ) Query was successful #end #end |
3.2. 字面字符串
当使用#set 指令时,括在双引号中的字面字符串将解析和重新解释,如下所示:#set( $directoryRoot = "www" ) #set( $templateName = "index.vm" ) #set( $template = "$directoryRoot/$templateName" ) $template |
www/index.vm |
#set( $foo = "bar" ) $foo #set( $blargh = '$foo' ) $blargh |
Bar $foo |
3.3. 条件
3.4. If / ElseIf / Else
Velocity中的#if 指令允许在页面生成时,在IF条件为真的情况下包含文本。例如:#if( $foo ) <strong>Velocity!</strong> #end |
如果求值为真时, #if 和 #end 语句之间的内容将输出。在这种情况下,如果 $foo 为真,输出将是"Velocity!"。相反,如果 $foo 具有一个null 值,或者逻辑假,语句求值为假,则没有输出。
一个 #elseif 或者 #else 项可以用在#if 语句中。请注意, Velocity 模板引擎将在第一个为真的表达式时停止。下面的例子中,假设$foo 具有值15 而 $bar 等于 6。
#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 |
请注意在现在, Velocity的数值比较约束为整型—其他类型都将求值为false。 仅有一个例外是等于'==',这时Velocity 要求等号两边的对象具有相同的类型。
3.5. 关系和逻辑操作符
Velocity 使用等式操作符来决定两个变量间的关系。这里是一个简单的例子演示如何使用等式操作符:#set ($foo = "deoxyribonucleic acid") #set ($bar = "ribonucleic acid") #if ($foo == $bar) In this case it's clear they aren't equivalent. So... #else They are not equivalent and this will be the output. #end |
## logical AND #if( $foo && $bar ) <strong> This AND that</strong> #end |
逻辑OR 的工作方式相同,唯一的例外是其中一个表达式要被求值,以便决定整个表达式是否为真。请看下面的例子:
## logical OR #if( $foo || $bar ) <strong>This OR That</strong> #end |
对于逻辑NOT 操作符,只有一个操作数:
##logical NOT #if( !$foo ) <strong>NOT that</strong> #end |
相关文章推荐
- Velocity的中文指南(1)-整理
- Velocity的中文指南(3)-整理
- Velocity的中文指南(4)-整理
- Velocity的中文指南(5)-整理
- velocity用户指南 超全面的中文教材
- Velocity的中文指南(1)
- velocity用户指南 超全面的中文教材 分享
- velocity用户指南(中文)
- iOS 5 ARC完全指南——深入浅出全面讲解ARC,整理PDF与大家分享!!!
- jqMobi学习笔记----中文API指南
- 整理了一份React-Native学习指南
- velocity中文乱码最终解决方案
- Matplotlib 中文用户指南 3.5 艺术家教程
- [个人整理]怎样把中文转换为16进制后,又还原为中文?
- Node.js和EMMET简单使用指南(未整理,慎入)
- ES中文学习指南---入门篇
- 关于MySql中文乱码的一些整理
- 【Scikit-Learn 中文文档】线性和二次判别分析 - 监督学习 - 用户指南 | ApacheCN
- 【Scikit-Learn 中文文档】广义线性模型 - 监督学习 - 用户指南 | ApacheCN
- 吐血整理:人工智能PDF中文教材资源包2.73G基本包含全部学习资料-人工智能学习书单