elocity是一个基于java的模板引擎(template engine)。
它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象。
当Velocity应用于web开发时,界面设计人员可以和java程序开发人员同步开发一个遵循MVC架构的web站点,也就是说,页面设计人员可以只 关注页面的显示效果,而由java程序开发人员关注业务逻辑编码。
Velocity将java代码从web页面中分离出来,这样为web站点的长期维护提 供了便利,同时也为我们在JSP和PHP之外又提供了一种可选的方案。
一、Velocity脚本语法摘要
1. 变量
(1)变量的定义:
#set($name = "hello")说明:velocity中变量是弱类型的。
当使用#set 指令时,括在双引号中的字面字符串将解析和重新解释,如下所示:
#set($directoryRoot = "www" )
#set($templateName = "index.vm" )
#set($template = "$directoryRoot/$templateName" )
$template
输出将会是:www/index.vm
注:在velocity中使用$2.5这样的货币标识是没有问题得的,因为velocity中的变量总是以一个大写或者小写的字母开始的。
(2)变量规范的写法
${name},也可以写成:$name。提倡用前面的写法。
例如:你希望通过一个变量$vice来动态的组织一个字符串。
Jack is a $vicemaniac.
本来变量是$vice现在却变成了$vicemaniac,这样Veloctiy就不知道您到底要什么了。所以,
应该使用规范的格式书写 : Jack is a ${vice}maniac
现在Velocity知道变量是$vice而不是$vicemaniac。
注意:当引用属性的时候不能加{}
(3)变量的赋值
$name="hello"
赋值的左边必须是一个变量或者是属性的引用.右边可以是下面六种类型之一:变量引用,字面字符串,属性引用,方法引用,字面数字,数组列表.
例子演示:
#set( $monkey = $bill ) ## variable reference 变量引用
#set( $monky.Friend = "monica" ) ## stirng 字面字符串
#set( $monkey.Blame = $whitehouse.Leak ) ## property reference 属性引用
#set( $monkey.Plan = $spindoctor.weave($web) ) ## method reference 方法引用
#set( $monkey.Number = 123 ) ## number 字面数字
#set( $monkey.Say = ["Not", $my, "fault"] ) ## ArrayList 数组列表
注意:①如果上述例子中的右值是null, 则左值不会被赋值,也就是说会保留以前的值。
②velocity模板中未被定义的变量将被认为是一个字符串。
例如:#set($foo = "gibbous")
$moon = $foo
输出结果为:
$moon = gibbous
③velocity模板中不会将reference解释为对象的实例变量。
例如:$foo.Name将被解释为Foo对象的getName()方法,而不是Foo对象的Name实例变量。
例如:$foo.getBar() 等同于$foo.Bar ;
$data.getUser("jon") 等同于$data.User("jon") ;
$data.getRequest().getServerName() 等同于$data.Request.ServerName等同于${data.Request.ServerName}
2.循环
#foreach ($element in $list)
This is $element.
$velocityCount
#end
例子:
#set( $list = ["pine", "oak", "maple"])
#foreach ($element in $list)
$velocityCount
This is $element.<br>
#end
输出的结果为:
1 This is pine.
2 This is oak.
3 This is maple.
说明:
每次循环$list中的一个值都会赋给$element变量。
$list可以是一个Vector、Hashtable或者Array。分配给$element的值是一个java对象,并且可以通过变量被引用。例如:如果$element t是一个java的Product类,并且这个产品的名字可以通过调用他的getName()方法得到。
#foreach ( $key in $list.keySet())
Key: $key -> Value: $list.get($key) <br>
#end
提示:velocity中大小写敏感。Velocity还特别提供了得到循环次数的方法,$velocityCount变量的名字是Velocity默认的名字。
例子:
First example:
#foreach ( $foo in [1..5] )
$foo
#end
Second example:
#foreach ( $bar in [2..-2] )
$bar
#end
Third example:
#set ( $arr = [0..1] )
#foreach ( $i in $arr )
$i
#end
上面三个例子的输出结果为:
First example:
1 2 3 4 5
Second example:
2 1 0 -1 -2
Third example:
0 1
3.条件语句
#if (condition)
#elseif (condition)
#else
#end
4.语句的嵌套
## outer foreach
#foreach ($element in $list)
## inner foreach 内循环
#foreach ($element in $list)
This is $element. $velocityCount <br>inner<br>
#end
## inner foreach 内循环结束
This is $element.
$velocityCount <br>outer<br>
#end
语句中也可以嵌套其他的语句,如#if…#else…#end等。
5.注释
(1)单行注释:
## This is a single line comment.
(2)多行注释:
#*
Thus begins a multi-line comment. Online visitors won’t
see this text because the Velocity Templating Engine will
ignore it.
*#
(3)文档格式:
#**
This is a VTL comment block and
may be used to store such information
as the document author and versioning
information:
@version 1.1
@author xiao
*#
6.关系和逻辑操作符
Velocity 也具有逻辑AND, OR 和 NOT操作符。
如
## example for AND
#if($foo && $bar)
<strong> This AND that</strong>
#end
例子中#if()指令仅在$foo和$bar 都为真的时候才为真。如果$foo为假,则表达式也为假;并且 $bar 将不被求值。如果$foo 为真,Velocity模板引擎将继续检查$bar的值,如果 $bar为真,则整个表达式为真。并且输出This AND that。如果 $bar 为假,将没有输出因为整个表达式为假。
7.Velocity中的宏
Velocity中的宏我们可以理解为函数。
①宏的定义
#macro(宏的名称$参数1 $参数2 …)
语句体(即函数体)
#end
②宏的调用
#宏的名称($参数1 $参数2 …)
说明:参数之间用空格隔开。
8.#stop
停止执行模板引擎并返回,把它应用于debug是很有帮助的。
9.#include与#parse
#include和#parse的作用都是引入本地文件,为了安全的原因,被引入的本地文件只能在TEMPLATE_ROOT目录下。
区别:
(1)与#include不同的是,#parse只能指定单个对象。而#include可以有多个
如果您需要引入多个文件,可以用逗号分隔就行:
#include ("one.gif", "two.txt", "three.htm" )
在括号内可以是文件名,但是更多的时候是使用变量的:
#include ( “greetings.txt”, $seasonalstock )
(2)#include被引入文件的内容将不会通过模板引擎解析;
而#parse引入的文件内容Velocity将会解析其中的velocity语法并移交给模板,意思就是说相当与把引入的文件copy到文件中。
#parse是可以递归调用的,例如:如果dofoo.vm包含如下行:
Count down.<br>
#set ($count =
#parse ("parsefoo.vm")
<br>All done with dofoo.vm!
那么在parsefoo.vm模板中,你可以包含如下VTL:velocity tag laugane
$count
#set($count = $count - 1)
#if ( $count > 0 )<br>
#parse( "parsefoo.vm" )
#else
<br>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!
注意:在vm中使用#parse来嵌套另外一个vm时的变量共享问题。如:
->a.vm 里嵌套 b.vm;
->a.vm 里定义了变量 $param;
->b.vm 里可以直接使用$param,无任何限制。
但需要特别注意的是,如果b.vm里同时定义有变量$param,则b.vm里将使用b.vm里定义的值。
10.转义字符'\'的使用
如果reference被定义,两个’\’意味着输出一个’\’,如果未被定义,刚按原样输出。如:
#set($email = "foo" )
$email
\$email
\\$email
\\\$email
输出:
foo
$email
\foo
\$email
如果$email未定义
$email
\$email
\\$email
\\\$email
输出:
$email
\$email
\\$email
\\$email (前面三个斜线,这里两个)
11.内在对象
Velocity内置了一些对象,在vm模版里可以直接调用,列举如下:
$request、$response、$session,另外,模板内还可以使用$msg内的消息工具访问 Struts 的国际化资源,达到简便实现国际化的方法。
12.数组访问
对数组的访问在Velocity中存在问题,因为Velocity只能访问对象的方法,而数组又是一个特殊的Array,所以虽然数组可以进行循环列举,但却不能定位访问特定位置的元素,如 strs[2],数组对固定位置元素的访问调用了Array的反射方法get(Object array, int index),而Velocity没能提供这样的访问,所以数组要么改成List等其他类容器的方式来包装,要么就通过公用Util类的方式来提供,传入数组对象和要访问的位置参数,从而达到返回所需值的目的。
二、实例
首先下载和安装Velocity。下载好后,解开压缩,把velocity-1.5.jar加入到CLASSPATH。
通常,Velocity模板的文件后缀是“.vm”。下面我们要创建一个hellovelocity.vm的模板文件,虽然很简单,但足以证明Velocity模板引擎是否正确安装,也足以显示出Volecity模板分离的内容及其表现方式的一般过程。把下面这行代码加入hellovelocity.vm模板。
Hello ${name}, this is Velocity working!
保存hellovelocity.vm模板,然后再新建一个HelloVelocity.java文件,这两个文件最好放入同一目录下。下面是HelloVelocity.java的代码,它显示了在Java程序中调用Velocity模板引擎的一般过程。
HelloVelocity.java
import java.io.StringWriter;
import java.util.Properties;
import org.apache.velocity.app.Velocity;
import org.apache.velocity.app.VelocityEngine;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
public class HelloVelocity {
public static void main(String[] args) throws Exception {
/* 首先创建一个模板引擎的实例,并予以初始化 */
VelocityEngine engine = new VelocityEngine();
Properties p = new Properties();
String basePath = "src/test/velocity/";//这里需要这样写路径!!!
p.setProperty(Velocity.FILE_RESOURCE_LOADER_PATH, basePath); // 设置模板的路径
engine.init(p);
/* 接着,获得一个模板 */
Template template = engine.getTemplate( "hellovelocity.vm" );
/* 创建上下文,填充数据 */
VelocityContext context = new VelocityContext(); context.put("name", "World");
/* 现在,把模板和数据合并,输出到StringWriter */
StringWriter writer = new StringWriter();
template.merge( context, writer );
/* 显示结果 */
System.out.println( writer.toString() );
}
}
hellovelocity.vm
Hello ${name}, this is Velocity working!
分享到:
相关推荐
Velocity是一个强大的模板引擎,常用于Java应用中的视图层,帮助开发者将静态模板与动态数据结合起来生成输出。在Velocity中,有一些基本的标记和语法,这些标记有助于构建模板并控制其行为。以下是对这些标记的详细...
在这个版本中,Velocity提供了基本的模板引擎功能,包括变量替换、控制结构(如if、for、foreach)以及宏定义等。它支持JavaBean和Map对象的直接引用,并且通过Action接口可以方便地进行用户自定义操作。此外,...
以上就是Velocity模板应用的基本介绍,它提供了高效、灵活的方式来构建动态内容,让开发者可以专注于业务逻辑,而将页面渲染的任务留给模板引擎。通过熟练掌握Velocity,我们可以提高Web应用的开发效率和代码质量。
**Velocity的基本用法** 1. **#set指令**: 用于设置变量,例如`#set($name = "Li Hong")`,这将在上下文中创建一个名为`name`的变量,其值为"Li Hong"。 2. **#if指令**: 用于条件判断,如`#if($age > 18)`表示...
Velocity的中文指南是学习Velocity的基础材料,它涵盖了Velocity的基本概念、语法、指令以及模板设计原则等内容。通过阅读这份文档,初学者可以了解到如何创建和使用Velocity模板,以及如何在模板中嵌入Java变量和...
Velocity是Apache软件基金会下的一个开源模板引擎,用于生成动态Web页面。...通过以上内容的学习,我们能够掌握Velocity模板引擎的基本使用方法,并能够将其应用于Servlet和Spring MVC项目中,完成动态网页内容的生成。
通过本书的学习,读者不仅可以掌握Velocity的基本用法,还能深入了解MVC设计模式的精髓,并通过具体的示例应用加深对Velocity模板引擎的理解。无论是对于Web开发者还是Web设计者来说,本书都是一个宝贵的资源,能够...
通过学习这四本书,开发者不仅可以掌握Velocity的基本用法,还能深入了解其在Web开发中的高级应用,从而提高工作效率,创建出更加灵活和易于维护的Web应用。无论你是初学者还是经验丰富的开发者,这套教程都能提供...
### Velocity1.4 学习指南中文版:关键知识点概览 #### 一、Velocity简介与核心目标 **Velocity** 是一款开源的模板引擎,它...无论是对于初学者还是经验丰富的开发者而言,掌握Velocity的基本用法都是非常有价值的。
学习Velocity时,建议从官方文档开始,了解基本语法和使用方法。同时,通过实践项目,比如创建一个简单的Web应用,加深对Velocity的理解。此外,可以参考 Velocity中文手册,它提供了详细的中文解释,对于初学者来说...
- **Velocity**则相对简单,支持基本的字符转义。 7. **数据绑定**: - **FreeMarker**支持更灵活的数据绑定方式,能够轻松地访问和操作Java对象的属性。 - **Velocity**的数据绑定功能虽然不如FreeMarker强大,...
Velocity的主要目标是将呈现逻辑从应用逻辑中分离出来,使得开发者可以专注于业务逻辑的实现,而设计人员则可以专注于页面的布局和设计。这个官方工具包不仅包含了Velocity的核心库,还提供了丰富的示例,帮助用户...
这四个JAR文件组合在一起,构成了一个基本的Velocity运行环境。在使用时,通常需要将这些库添加到项目的类路径中,以便Velocity能够正确运行和解析模板。在Web应用中,这通常通过在`WEB-INF/lib`目录下放置这些JAR...
以上是对Velocity和FreeMarker的基本介绍和比较,它们都是Java Web开发中的重要工具,理解它们的特性和应用场景有助于选择最适合项目的技术栈。对于标签“源码”和“工具”,我们可以进一步研究这两个模板引擎的源...
《Velocity》一书是关于Apache Velocity模板引擎的...通过学习《Velocity》电子书,读者不仅可以掌握Velocity的基本用法,还能深入了解其高级特性,从而在实际项目中更有效地利用Velocity来提高开发效率和代码质量。
在深入 Velocity 的核心概念之前,我们先了解一下它的基本原理。Velocity 将模板语言(如 `.vm` 文件)与Java代码相融合,通过简单的语法结构,如 `${expression}` 和 `#if`, `#foreach` 等控制结构,让开发者可以在...
Velocity 在 Web 开发中的应用: 1. 提供了模板服务,可以将模板与 Java 代码集成,生成动态网页。 2. 能够实现客户化的网页,根据用户的喜好提供个性化的信息。 3. 可以与 Turbine web 开发架构集成,提供模板服务...
这个工程旨在通过实际的代码演示,帮助开发者理解并掌握Velocity的基本用法,无需深入学习复杂的配置文件。 在传统的Java Web开发中,视图层通常与业务逻辑和数据层分离,Velocity就扮演了视图的角色,允许开发者将...
1. **Velocity的基本概念** - **模板(Template)**:Velocity模板是HTML或XML文件,其中包含Velocity指令和变量,它们在运行时由Velocity解释器替换为实际值。 - **上下文(Context)**:上下文是数据容器,用于...
Velocity被广泛应用于Web应用开发、文档生成、报告制作等领域,因其简洁的语法和良好的可读性而备受青睐。本篇将详细介绍Velocity的基本语法和特性。 ## 1. Velocity模板语言基础 Velocity模板语言(VTL)是一种...