Velocity是一个基于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( $monkey.Friend = "monica" ) ## string

#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.
#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. 语句的嵌套

#foreach ($element in $list)

## inner foreach 内循环

#foreach ($element in $list)

This is $element. $velocityCount <br>inner<br>
#end

## inner foreach 内循环结束

## outer 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 = 8)

#parse ("parsefoo.vm")
<br>All done with dofoo.vm!

那么在parsefoo.vm模板中,你可以包含如下VTL:

$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

\$emai

l\\$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学习2的更多相关文章

  1. Velocity学习

    原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11790482.html Velocity学习: 1. velocity对大小写敏感 2. ve ...

  2. velocity学习总结

    什么是velocity velocity是一个基于Java的模板引擎,它可以实现彻底的前后端,前端不允许像jsp那样出现Java代码,而是利用context容器传递变量,在java代码里面我们可以往容 ...

  3. Velocity学习笔记

    一.为什么要使用velocity? 很多人下载了EasyJWeb的开源应用示例,但是对动态页面模板文件中的标签使用不是很熟悉,这里简单介绍一下.EasyJWeb特定把视图限定为Velocity,因为我 ...

  4. Velocity学习4

    Velocity是一个基于java的模板引擎(template engine).它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象. 当Veloci ...

  5. Velocity学习3

    Velocity快速入门教程 Apache的速度是一个基于Java的的模板引擎(模板引擎),它允许任何人仅仅简单的使用模板语言(模板语言)来引用由java的代码定义的对象. 官网介绍如下: Veloc ...

  6. 模板引擎Velocity学习系列-#set指令

    #set指令 #set指令用于向一个变量或者对象赋值. 格式: #set($var = value) LHS是一个变量,不要使用特殊字符例如英文句号等,不能用大括号括起来.测试发现#set($user ...

  7. velocity学习记录

    一.引入文件 静态引入:#include("./footer.vm.html") 动态引入:#parse("./header.vm.html") 说明:./为v ...

  8. velocity模板引擎学习(1)

    velocity与freemaker.jstl并称为java web开发三大标签技术,而且velocity在codeplex上还有.net的移植版本NVelocity,(注:castle团队在gith ...

  9. 一个Velocity Template Language学习的框架

    Velocity Template Language(VTL)使得数据展示和后台代码的开发分离开来,最初用在基于servlet的网站开发上,它的这一特性使得它在应付MVC Web开发模式时显得尤其合适 ...

随机推荐

  1. sqlserver的资源调控器

    参考SQL Server2014管理最佳实战,所做的笔记. 1:创建资源池 use master go create resource pool poolAdhoc with ( min_cpu_pe ...

  2. 解决 There are no resources that can be added or removed from the server

    网上下载了一个项目,在eclipse中部署时,加载项目到tomcat中项目名称无法显示,报出There are no resources that can be added or removed fr ...

  3. 用以替换系统NSLog的YouXianMingLog

    用以替换系统NSLog的YouXianMingLog 这是本人自己使用并改良的用以替换系统NSLog的类,非常好用,以下是使用示例,现在开源出来并提供源码,好用的话顶一下吧^_^ 效果: YouXia ...

  4. Composer 的简介、安装及使用

    Composer的简介 简单说,Composer 就是一个安装包管理工具,服务于 PHP 生态系统.它包括了两个部分:Composer 和 Packagist. Composer Composer 是 ...

  5. HTTP 错误 404.3 - Not Found的问题(WCF)

    模块 StaticFileModule 通知 ExecuteRequestHandler 处理程序 StaticFile 错误代码 0x80070032 请求的 URL http://10.101.3 ...

  6. September 04th 2017 Week 36th Monday

    Try not to become a man of success but rather try to become a man of value. 不要努力去做一个成功的人,而要努力去做一个有价值 ...

  7. git did not exit cleanly (exit code 128)

    github,pull和push的时候出问题,提示git did not exit cleanly (exit code 128) 使用HTTP格式的url,不要使用SSH格式的url,在官网上赋值下 ...

  8. 阿里八八Alapa事后诸葛亮

    设想和目标 1.我们的软件要解决什么问题?是否定义的很清楚?是否对典型用户和典型场景有清晰的描述? 我们的项目希望解决用户对于时间.日程管理上不够方便.直观.易丢失的问题,因为并不是新颖高端的概念,因 ...

  9. APP案例分析-摩拜单车app

    第二次作业-App案例分析 本次案例分析选用的是 摩拜单车IOS5.7.5版本 测试环境为 IPhone 6s (IOS11.0.1,含有3DTOUCH功能).本次案例分析仅针对APP 而言,并不涉及 ...

  10. 张高兴的 Windows 10 IoT 开发笔记:使用 MAX7219 驱动数码管

    This is a Windows 10 IoT Core project on the Raspberry Pi 2/3, coded by C#. GitHub:https://github.co ...