Velocity利用了很多java规范以方便了设计人员的使用。例如:
HTML代码
- $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}
但是,注意VTL中不会将reference解释为对象的实例变量。例如:$foo.Name将被解释为Foo对象的getName()方法,而不是Foo对象的Name实例变量。
Directives(google translate:指令)
Reference允许设计者使用动态的内容,而directive使得你可以应用java代码来控制你的显示逻辑,从而达到你所期望的显示效果。
#set
#set directive被用于设置一个reference的值。例如:
#set ( $primate = “monkey” )
#set ( $customer.Behavior = $primate )
赋值左侧的(LHS)必须是一个变量或者属性reference。右侧(RHS)可以是以下类型中一种:
l 变量reference
l String literal
l 属性reference
l 方法reference
l number literal
l ArrayList
下面是应用各种类型的RHS的例子:
HTML代码
- #set ( $monkey = $bill ) ##变量reference
- #set ( $monkey.Friend = “monica” ) ##String literal
- #set ( $monkey.Blame = $whitehouse.Leak )##属性reference
- #set ( $monkey.Plan = $spindoctor.weave($web) )##方法reference
- #set ( $monkey.Number = 123 )##Number literal
- #set ( $monkey.Say = [“Not”, $my, “fault”] )##ArrayList
注意:最后一个例子的取值方法为:$monkey.Say.get(0)
RHS也可以是一个简单的算术表达式:
HTML代码
- #set ( $value = $foo + 1 )
- #set ( $value = $bar -1 )
- #set ( $value = $foo * $bar )
- #set ( $value = $foo / $bar )
如果你的RHS是一个null,VTL的处理将比较特殊:它将指向一个已经存在的reference,这对初学者来讲可能是比较费解的。例如:
#set ( $resut = $query.criteria(“name”) )
The result of the first query is $result
#set ( $resut = $query.criteria(“address”) )
The result of the second query is $result
如果$query.criteria(“name”)返回一个“bill”,而$query.criteria(“address”)返回的是null,则显示的结果如下:
The result of the first query is bill
The result of the first query is bill
看看下面的例子:
Velocity代码
- #set( $criteria = ["name", "address"] )
- #foreach( $criterion in $criteria )
- #set( $result = $query.criteria($criterion) )
- #if( $result )
- Query was successful
- #end
- #end
在上面的例子中,程序将不能智能的根据$result的值决定查询是否成功。在$result被#set后(added to the context),它不能被设置回null(removed from the context)。打印的结果将显示两次查询结果都成功了,但是实际上有一个查询是失败的。
为了解决以上问题我们可以通过预先定义的方式:
Velocity代码
- #set( $criteria = [“name”, “address”] )
- #foreach( $criterion in $criteria )
- #set( $result = false )
- #set( $result = $query.criteria( $criterion ) )
- #if( $result )
- Query was successful
- #end
- #end
- String Literals
当你使用#set directive,String literal封闭在一对双引号内。
#set ( $directoryRoot = “www” )
#set ( $templateName = “index.vm” )
#set ( $template = “$directoryRoot/$tempateName” )
$template
上面这段代码的输出结果为:www/index.vm
但是,当string literal被封装在单引号内时,它将不被解析:
#set ( $foo = “bar” )
$foo
#set ( $blargh = ‘$foo’ )
结果:
bar
$foo
上面这个特性可以通过修改velocity.properties文件的stringliterals.interpolate = false的值来改变上面的特性是否有效。
条件语句
if/else if/else
当一个web页面被生成时使用Velocity的#if directrive,如果条件成立的话可以在页面内嵌入文字。例如:
#if ( $foo )
Velocity!
#end
上例中的条件语句将在以下两种条件下成立:
l $foo是一个boolean型的变量,且它的值为true
l $foo变量的值不为null
这里需要注意一点:Velocity context仅仅能够包含对象,所以当我们说“boolean”时实际上代表的时一个Boolean对象。即便某个方法返回的是一个boolean值,Velocity也会利用内省机制将它转换为一个Boolean的相同值。
如果条件成立,那么#if和#end之间的内容将被显示。
#elseif和#else元素可以同#if一同使用。例如:
#if( $foo < 10 )
Go North
#elseif( $foo == 10 )
Go East
#elseif( $foo == 6 )
Go South
#else
Go West
#end
注意这里的Velocity的数字是作为Integer来比较的――其他类型的对象将使得条件为false,但是与java不同它使用“==”来比较两个值,而且velocity要求等号两边的值类型相同。
关系、逻辑运算符
Velocity中使用等号操作符判断两个变量的关系。例如:
#set ( $foo = “deoxyribonucleic acid” )
#set ( $bar = “ribonucleic acid” )
#if ( $foo == $foo )
In this case it’s clear they aren’t equivalent.So…
#else
They are not equivalent and this will be the output.
#end
Velocity有AND、OR和NOT逻辑运算符。下面是一些例子:
## logical AND
#if( $foo && $bar )
This AND that
#end
## logical OR
#if ( $foo || $bar )
This OR That
#end
##logical NOT
#if ( !$foo )
NOT that
#end
循环
Foreach循环
例子:
Html 代码
- <ul>
- #foreach ( $product in $allProducts )
- <li> $product </li>
- #end
- </ul>
每次循环$allProducts中的一个值都会赋给$product变量。
$allProducts可以是一个Vector、Hashtable或者Array。分配给$product的值是一个java对象,并且可以通过变量被引用。例如:如果$product是一个java的Product类,并且这个产品的名字可以通过调用他的getName()方法得到。
现在我们假设$allProducts是一个Hashtable,如果你希望得到它的key应该像下面这样:
Html代码
- <ul>
- #foreach ( $key in $allProducts.keySet() )
- <li>Key: $key -> Value: $allProducts.get($key) </li>
- #end
- </ul>
Velocity还特别提供了得到循环次数的方法,以便你可以像下面这样作:
Html 代码
- <table>
- #foreach ( $customer in $customerList )
- <tr><td>$velocityCount</td><td>$customer.Name</td></tr>
- #end
- </table>
$velocityCount变量的名字是Velocity默认的名字,你也可以通过修改velocity.properties文件来改变它。默认情况下,计数从“1”开始,但是你可以在velocity.properties设置它是从“1”还是从“0”开始。下面就是文件中的配置:
# Default name of loop counter
# variable reference
directive.foreach.counter.name = velocityCount
# Default starting value of the loop
# counter variable reference
directive.foreach.counter.initial.value = 1
include
#include script element允许模板设计者引入本地文件。被引入文件的内容将不会通过模板引擎被render。为了安全的原因,被引入的本地文件只能在TEMPLATE_ROOT目录下。
#inclued ( “one.txt” )
如果您需要引入多个文件,可以用逗号分隔就行:
#include ( “one.gif”, “two.txt”, “three.htm” )
在括号内可以是文件名,但是更多的时候是使用变量的:
#inclue ( “greetings.txt”, $seasonalstock )
parse
#parse script element允许模板设计者一个包含VTL的本地文件。Velocity将解析其中的VTL并render模板。
#parse( “me.vm” )
就像#include,#parse接受一个变量而不是一个模板。任何由#parse指向的模板都必须包含在TEMPLATE_ROOT目录下。与#include不同的是,#parse只能指定单个对象。
你可以通过修改velocity.properties文件的parse_direcive.maxdepth的值来控制一个template可以包含的最多#parse的个数――默认值是10。#parse是可以递归调用的,
例如:如果dofoo.vm包含如下行:
Count down.
Velocity 代码
- #set ( $count = 8 )
- #parse ( “parsefoo.vm” )
- All done with dofoo.vm!
那么在parsefoo.vm模板中,你可以包含如下VTL:
Velocity代码
- $count
- #set ( $count = $count – 1 )
- #if ( $count > 0 )
- #parse( “parsefoo.vm” )
- #else
- All done with parsefoo.vm!
- #end
的显示结果为:
Count down.
8
7
6
5
4
3
2
1
0
All done with parsefoo.vm!
All done with dofoo.vm!
分享到:
相关推荐
在这个"velocity的学习资料"压缩包中,我们很可能会找到关于Velocity的基本概念、语法、最佳实践以及如何将其整合到Java Web项目中的相关信息。 1. **Velocity基本概念** - **模板语言**: Velocity使用简单的文本...
文件中提到了一些中文资料,如《VelocityJava开发指南中文版》、《Velocity模板使用指南中文版》等,这表明Velocity社区提供了相当完善的中文资料,有助于Java开发者更快速地学习和掌握Velocity的使用方法。...
【Velocity资料汇总】 Velocity,作为一个开源的Java模板引擎,是Apache软件基金会的Jakarta项目之一。它被设计用于Web应用程序中的动态网页生成,但也可以应用于任何需要将结构化数据转化为文本输出的场景,如生成...
Velocity 是一个基于Java的模板引擎,它允许网页设计师在页面中嵌入动态内容,而无需直接接触Java代码。...无论你是新手还是经验丰富的开发者,这份Velocity中文资料都将是你理解和掌握Velocity的强大工具。
在这个“velocity学习资料.zip”压缩包中,可能包含了关于Velocity的基本概念、语法、最佳实践以及一些示例代码,帮助初学者或有经验的开发者更好地理解和应用Velocity。 Velocity的工作原理基于MVC(Model-View-...
**Velocity中文手册与学习资料详解** Velocity是一款基于Java的模板引擎,它允许开发者将HTML页面设计与业务逻辑相分离,让网页设计人员专注于页面布局,而程序员则专注于编写控制逻辑。Velocity通过简单的语法使得...
在使用Velocity时,你需要创建一个Velocity上下文(Context),在这个上下文中添加你想要在模板中访问的对象。然后,通过Velocity模板引擎将这个上下文和模板文件合并,生成最终的输出。Velocity引擎会自动处理对象的...
1. **取变量**:在 Velocity 中,我们可以直接使用 `$` 符号来访问变量,如 `$customer` 表示取名为 `customer` 的变量。如果要访问对象的属性,可以使用点操作符,例如 `$customer.Name` 来获取 `customer` 对象的 ...
- 博文链接:[https://zxymicky.iteye.com/blog/1112064](https://zxymicky.iteye.com/blog/1112064) 这个链接可能提供有关Velocity的进一步学习资料或实例教程。 通过掌握Velocity,开发者可以提高Web应用的开发...
Velocity是Apache软件基金会下的一个开源项目,它是一个基于Java的模板引擎,主要用在Web应用中生成动态内容。Velocity通过简单的语法,将业务逻辑与表现层分离,使得开发者可以专注于业务逻辑的编写,而不用关心...
Velocity插件通常是集成在构建工具(如Maven或Gradle)或IDE(如Eclipse或IntelliJ IDEA)中,以方便开发者更高效地使用Velocity模板语言。这些插件通常提供自动完成、语法高亮、错误检查等功能,提高开发效率和代码...
在初学者资料中,我们首先了解了Velocity的基本概念。Velocity的主要优点包括它简洁的语法、高效的性能以及良好的可扩展性。通过集成Struts2,Velocity可以被用于构建动态Web应用程序,帮助开发者更方便地管理视图层...
1. **学习资源相对较少**:相较于主流的技术栈如React、Vue等,关于Velocity的学习资料和社区支持较为有限。 2. **生态系统不如主流技术成熟**:在某些高级功能的支持方面,如组件化开发等方面,Velocity可能不如...
但是遗憾的是 , 市面上并没有一款详细的Velocity教程 , 特别是最新版本的velocity使用, 相关资料更是少的可怜 ! 所以我们这套课程有如下特色 : l 从基础开始 : 只要有一些java开发的基础就可以学习第一部分velocity...
这与JSP(JavaServer Pages)有所不同,JSP虽然也实现了视图和控制的分离,但仍然允许在页面中嵌入Java代码,而Velocity完全避免了这种混合。 在Velocity中,模板语言称为Velocity Template Language (VTL),它是一...
### Apache Velocity概述与核心特性 #### 一、Apache Velocity简介 Apache Velocity 是一款基于 Java 的模板引擎,由 Apache 软件基金会...对于想要深入了解 Velocity 的开发者来说,这本书是非常有价值的参考资料。
`Velocity_《VTL语法参考指南》中文版.doc` 提供了详细的学习材料,`velocity-1.6.jar` 是实际开发中必不可少的库,而`velocity.ppt` 则可能是进一步了解和学习Velocity的辅助资料。对于想要深入了解和使用Velocity...
根据提供的标题、描述、标签及部分内容,我们可以了解到这段资料主要涉及的是Velocity模板引擎在.NET环境下的使用,并且特别提到了如何解决中文字符显示时出现的乱码问题。下面将对这些知识点进行详细的解读。 ### ...
这份压缩包中的"Velocity"文件包含了更详细的学习资料,包括示例代码、教程文档等,建议结合实际案例进行学习,以加深对Velocity的理解。 总之,Velocity是Java Web开发中一个强大的工具,通过熟悉其基本概念和语法...
花了所有CSDN积分收集来的Velocity资料集合: Velocity Java开发指南中文版 Velocity Web应用开发指南中文版 Velocity模板使用指南中文版 VTL语法参考指南中文版 DB4O系统应用之起步篇 velocity用户手册 velocity...