Velocity基于Java的模板引擎

Velocity是一个基于Java的模板引擎,通过特定的语法可以获取Java对象的数据,将其填充到模板中,从而实现界面和Java代码的分离。它广泛应用于Web应用程序、源代码生成、自动电子邮件以及网页静态化等场景。

Velocity
图片来源:Apache Velocity | Vivek's Tech Blog

应用场景

Velocity在以下场景中得到广泛应用:

  1. Web应用程序: 作为应用程序的视图,用于展示数据。
  2. 源代码生成: 可用于基于模板生成Java源代码。
  3. 自动电子邮件: 用于生成网站注册、认证等的电子邮件模板。
  4. 网页静态化: 基于Velocity模板,生成静态网页。

组成结构

Velocity的组成结构主要包括以下模块:

  1. app模块: 主要封装了一些接口,暴露给使用者使用。包含Velocity(单例)和VelocityEngine两个主要类。
  2. Context模块: 主要封装了模板渲染需要的变量。
  3. Runtime模块: 整个Velocity的核心模块,负责将加载的模板解析成语法树,然后在渲染时输出最终结果。
  4. 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有更深入的了解,并能在实际项目中灵活应用。

Velocity基于Java的模板引擎

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注