Velocity是基于Java的模板引擎,它允许页面设计者引用Java中定义的方法。页面设计者和Java开发者能够同时使用MVC的模式开发网站,这样网页设计者能够把精力放在页面的设计上,程序员也可以把精力放在代码开发上。Velocity把Java代码从Web页面中分离, 使网站可维护性更强,同时也在Java服务器页面(JSPs)或者PHP中提供了可视化交互的选择。

Velocity 可以被用在以下场景中:

  1. Web 应用:开发者在不使用 JSP 的情况下,可以用 Velocity 让 HTML 具有动态内容的特性。

  2. 源代码生成:Velocity 可以被用来生成 Java 代码、SQL 或者 PostScript。有很多开源和商业开发的软件是使用 Velocity 来开发的。

  3. 自动 Email:很多软件的用户注册、密码提醒或者报表都是使用 Velocity 来自动生成的。使用 Velocity 可以在文本文件里面生成邮件内容,而不是在 Java 代码中拼接字符串。

  4. 转换 xml:Velocity 提供一个叫 Anakia 的 ant 任务,可以读取 XML 文件并让它能够被 Velocity 模板读取。一个比较普遍的应用是将 xdoc 文档转换成带样式的 HTML 文件。

一、变量

1. 变量定义

velocity 中的变量是弱类型,大小写敏感。

#set($name="velocity")

当使用 set 指令时,等号后面引号中的字面字符串将解析和重新解析,例如出现以  $  开始的字符串时,将做变量的替换。

#set($hello="hello $name")

上面的这个等式将会给 $hello 赋值为“hello velocity”

2. 变量使用

在模板文件中使用 $name 或者 ${name}  来使用定义的变量。推荐使用 ${name}  这种格式,因为在模板中同时可能定义了类似 $name 和 $names 的两个变量,如果不选用大括号的话,引擎就没有办法正确识别 $names 这个变量。
对于一个复杂对象类型的变量,例如 $person,可以使用 ${person.name} 来访问 person 的 name 属性。值得注意的是,这里的 ${person.name} 并不是直接访问 person 的 name 属性,而是访问 person 的 getName() 方法,所以 ${person.name} 和${person.getName()} 是一样的。

3. 变量赋值

对于 Velocity 来说,变量是弱数据类型的,可以在赋了一个 String 给变量之后再赋一个数字或者数组给它。

赋值的左边必须是一个变量或者属性引用。

赋值的右边可以是以下6种类型之一:

  • 变量引用
  • 字面字符串
  • 属性引用
  • 方法引用
  • 字面数字
  • 数组列表
#set($foo = $bar)
#set($foo ="hello")
#set($foo.name = $bar.name)
#set($foo.name = $bar.getName($arg))
#set($foo = 123)
#set($foo = ["foo",$bar])

注:(1)如果上述例子中右值为 null,则左值不会被赋值,也就是说会保留以前的值。

  (2)Velocity 模板中未被定义的变量将会认为是字符串。例如:

#set($foo = $bar)
$foo 输出结果:
$foo

二、循环语句

#set($list=["velocity","freemarker","jsp"])

#foreach($element in $list)
<p>${velocityCount}. This is ${element}</p>
#end 输出结果:
1. This is velocity 2. This is freemarker 3. This is jsp

Velocity 引擎会将 list 中的值循环赋给 element 变量,同时会创建一个 $velocityCount 的变量作为计数,从 1 开始,每次循环都会加 1。

另外,Velocity 中还提供了得到循环次数的方法, $velocityCount 变量的名字是 Velocity 默认的名字。

#foreach($i in [1..3])
$i
#end 输出结果:
1 2 3

三、条件语句

#if($condition > 5)
<p>condition > 5</p>
#elseif($condition == 5)
<p>condition = 5</p>
#else
<p>condition < 5</p>
#end 输出结果:
condition = 5

四、关系操作符

Velocity 引擎提供了 AND、OR 和 NOT 操作符,分别对应 && 、|| 和 ! 。

#set($a=true)
#set($b=false) #if($a && $b)
This is all true.
#end

五、宏

Velocity 中的宏可以理解为函数定义。

(1)宏的定义:

#macro(宏的名称 $参数1 $参数2 ...)
语句体(即函数体)
#end

(2)宏的调用:

#宏的名称($参数1 $参数2 ...)

注意:参数之间用空格隔开

(3)示例:

#macro(func $args1 $args2)
This is a macro. The argument have ${args1} and ${args2}.
#end #func("hello" "world") 输出结果:
This is a macro. The argument have hello and world.

六、#parse 与 #include

#parse 与 #include 指令的功能都是在外部引用文件,而两者的区别是,#parse 会将引用的内容当成类似于源码文件,会将内容在引入的地方进行解析,#include 是将引入文件当成资源文件,会将引入内容原封不动地以文本输出。

示例:

foo.vm 文件:

#set($name="velocity")
$name

(1)parse.vm 文件:

#parse("foo.vm")

输出结果:

velocity

(2)include.vm 文件

#include("foo.vm")

输出结果:

#set($name="velocity") $name

Velocity 语法详解的更多相关文章

  1. Velocity魔法堂系列二:VTL语法详解

    一.前言 Velocity作为历史悠久的模板引擎不单单可以替代JSP作为Java Web的服务端网页模板引擎,而且可以作为普通文本的模板引擎来增强服务端程序文本处理能力.而且Velocity被移植到不 ...

  2. Hive笔记--sql语法详解及JavaAPI

    Hive SQL 语法详解:http://blog.csdn.net/hguisu/article/details/7256833Hive SQL 学习笔记(常用):http://blog.sina. ...

  3. Hadoop Hive sql语法详解

    Hadoop Hive sql语法详解 Hive 是基于Hadoop 构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式来分析存储在Hadoop 分布式文件系统中的数据,可以将结构 化的数据文件 ...

  4. Thymeleaf3语法详解和实战

    Thymeleaf3语法详解 Thymeleaf是Spring boot推荐使用的模版引擎,除此之外常见的还有Freemarker和Jsp.Jsp应该是我们最早接触的模版引擎.而Freemarker工 ...

  5. Xpath语法详解

    1.简介 XPath是一门在XML和HTML文档中查找信息的语言,可以用来在XML和HTML文档中对元素和属性进行遍历 XPath的安装 Chrome插件XPath Helper 点Chrome浏览器 ...

  6. mysql用户授权、数据库权限管理、sql语法详解

    mysql用户授权.数据库权限管理.sql语法详解 —— NiceCui 某个数据库所有的权限 ALL 后面+ PRIVILEGES SQL 某个数据库 特定的权限SQL mysql 授权语法 SQL ...

  7. Java8的Stream语法详解(转载)

    1. Stream初体验 我们先来看看Java里面是怎么定义Stream的: A sequence of elements supporting sequential and parallel agg ...

  8. [持续交付实践] pipeline使用:语法详解

    一.引言 jenkins pipeline语法的发展如此之快用日新月异来形容也不为过,而目前国内对jenkins pipeline关注的人还非常少,相关的文章更是稀少,唯一看到w3c有篇相关的估计是直 ...

  9. Java 8系列之Stream的基本语法详解

    本文转至:https://blog.csdn.net/io_field/article/details/54971761 Stream系列: Java 8系列之Stream的基本语法详解 Java 8 ...

随机推荐

  1. Selenium入门9 上传文件

    上传文件步骤 1 找到文件上传的input标签  find_element_by_css_selector("input[type='file']") 2 用send_keys传入 ...

  2. MSD_radix_sort

    一.这次是在上一次尝试基础上进行的,预期是达到上次性能的9倍. MSD的基本手法就是不断切片.每一步都是把整体数据切割成256片,如上图所示,实际情况切片未必均匀,有的slice内可能一个元素也没有. ...

  3. 网格中的BFS,逆向(POJ2049)

    题目链接:http://poj.org/problem?id=2049 解题报告: 网格中的BFS,最主要的是边界问题. 1.这里在左右,上下两个方向上,分别判断墙,和门,细节是,向上有t个墙,for ...

  4. url网址解析的好帮手

    接下来进入node的重点,也就是介绍nodejs主要api的功能和如果使用,由于nodejs逐渐能满足这种高并发和大规模的场景.他才被更多的公司所采用 无论什么资源,一定要有明确的地址才有意义,在互联 ...

  5. 重写KVC

    #import "NSObject+WQKVC.h" #import <objc/runtime.h> /** KVC 首先调用的方法顺序: |- setter: se ...

  6. Performing User-Managed Database-18.5、Restoring Control Files

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/offbeatmine/article/details/28429339 18.5.Restoring ...

  7. 【转】Android UI开发第二十四篇——Action Bar

    Action bar是一个标识应用程序和用户位置的窗口功能,并且给用户提供操作和导航模式.在大多数的情况下,当你需要突出展现用户行为或全局导航的activity中使用action bar,因为acti ...

  8. python web应用--web框架(三)

    了解了WSGI框架,我们发现:其实一个Web App,就是写一个WSGI的处理函数,针对每个HTTP请求进行响应. 但是如何处理HTTP请求不是问题,问题是如何处理100个不同的URL. 每一个URL ...

  9. How good are detection proposals, really?

    How good are detection proposals, really? J. Hosang, R. Benenson, B. Schiele Oral at BMVC 2014 http: ...

  10. Junit 测试 @Test 红名问题

    准备测试,如上图,都是红名 Ctrl+1 或者鼠标放在@Test上 鼠标放在@Test上出现上面这种就可直接点击安装了 如果是下边这种 Test is not an annotation type,一 ...