Velocity是一个基于Java的模板引擎,通过特定的语法可以获取Java对象的数据,将其填充到模板中,从而实现界面和Java代码的分离。它广泛应用于Web应用程序、源代码生成、自动电子邮件以及网页静态化等场景。
应用场景
Velocity在以下场景中得到广泛应用:
- Web应用程序: 作为应用程序的视图,用于展示数据。
- 源代码生成: 可用于基于模板生成Java源代码。
- 自动电子邮件: 用于生成网站注册、认证等的电子邮件模板。
- 网页静态化: 基于Velocity模板,生成静态网页。
组成结构
Velocity的组成结构主要包括以下模块:
- app模块: 主要封装了一些接口,暴露给使用者使用。包含Velocity(单例)和VelocityEngine两个主要类。
- Context模块: 主要封装了模板渲染需要的变量。
- Runtime模块: 整个Velocity的核心模块,负责将加载的模板解析成语法树,然后在渲染时输出最终结果。
- RuntimeInstance模块: 提供了整个Velocity渲染过程的单例模式实例。
快速入门
1. 创建项目并引入Velocity依赖
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.2</version>
</dependency>
2. 创建模板文件
在resources
目录下创建模板文件,例如demo01.vm
:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
hello, ${name}!
</body>
</html>
3. 编写Java代码
@Test
void contextLoads() throws IOException {
Properties prop = new Properties();
prop.put("file.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");Velocity.init(prop);
VelocityContext context = new VelocityContext();
context.put("name", "一切总会归于平淡");Template tpl = Velocity.getTemplate("vms/demo01.vm", "UTF-8");
FileWriter fw = new FileWriter("output/demo01.html");
tpl.merge(context, fw);fw.close();
}
基础语法
1. VTL注释
- 行注释:
## 行注释内容
- 块注释:
#* 块注释内容1 块注释内容2 *#
- 文档注释:
#** 文档注释内容1 文档注释内容2 *#
2. 非解析内容
非解析内容即不会被Velocity解析的内容,使用#[[ 非解析内容1 非解析内容2 ]]#
定义。
3. 引用
3.1 变量引用
$变量名
:若上下文中没有对应的变量,则输出字符串$变量名
。${变量名}
:若上下文中没有对应的变量,则输出字符串${变量名}
。$!变量名
:若上下文中没有对应的变量,则输出空字符串""
。${!变量名}
:若上下文中没有对应的变量,则输出空字符串""
。
3.2 属性引用
$变量名.属性
:若上下文中没有对应的变量,则输出字符串$变量名.属性
。${变量名.属性}
:若上下文中没有对应的变量,则输出字符串${变量名.属性}
。$!变量名.属性
:若上下文中没有对应的变量,则输出空字符串""
。${!变量名.属性}
:若上下文中没有对应的变量,则输出空字符串""
。
3.3 方法引用
$变量名.方法([入参1[, 入参2]*]?)
:若上下文中没有对应的变量,则输出字符串$变量名.方法([入参1[, 入参2]*]? )
。${变量名.方法([入参1[, 入参2]*]?)}
:若上下文中没有对应的变量,则输出字符串${变量名.方法([入参1[, 入参2]*]?)}
。$!变量名.方法([入参1[, 入参2]*]?)
:若上下文中没有对应的变量,则输出空字符串""
。${!变量名.方法([入参1[, 入参2]*]?)}
:若上下文中没有对应的变量,则输出空字符串""
。
4. 指令
4.1 流程控制
#set
:在页面中声明定义变量。#if
/#elseif
/#else
:逻辑判断。#foreach
:遍历循环数组或者集合。
4.2 引入资源
#include
:引入外部资源,不会被引擎解析。#parse
:引入外部资源,将被引擎解析。#define
:定义重用模块,不带参数。#evaluate
:动态计算,可在字符串中使用变量。
4.3 宏指令
#macro
:定义重用模块,可带参数。#end
:结束宏定义。- 调用宏:
#宏名([$arg]?)
结语
Velocity为Java开发者提供了一个强大而灵活的模板引擎,使界面与后台逻辑分离变得更加容易。通过理解基础语法和灵活运用指令,开发者可以高效地实现各种场景下的模板渲染,提高开发效率。Velocity的应用范围广泛,为Web开发、源代码生成等提供了便捷的解决方案。通过这篇文章,希望读者对Velocity有更深入的了解,并能在实际项目中灵活应用。