Java Jinjava
最后修改于 2024 年 1 月 27 日
Java Jinjava 教程展示了如何使用 Jinjava 在 Java 中创建模板。
模板引擎是一个用于将模板与数据相结合以生成文档的库。模板引擎用于生成大量电子邮件、进行源代码预处理或生成动态 HTML 页面。
模板由静态数据和动态区域组成。动态区域稍后会被数据替换。渲染函数随后将模板与数据结合。模板引擎用于将模板与数据模型相结合以生成文档。
Jinjava 库是一个 Java 模板引擎,其灵感来自 Python 的 jinja 模板引擎。
Jinjava 在模板字符串中使用各种分隔符
{% %}- 语句{{ }}- 要打印到模板输出的表达式{# #}- 不包含在模板输出中的注释# ##- 行语句
文档使用 render 方法渲染。该方法接受模板字符串和上下文,其中包含数据。
<dependency>
<groupId>com.hubspot.jinjava</groupId>
<artifactId>jinjava</artifactId>
<version>2.6.0</version>
</dependency>
我们使用 jinjava 依赖项。
Jinjava 简单示例
以下是一个 Jinjava 简单示例。
package com.zetcode;
import com.google.common.collect.Maps;
import com.hubspot.jinjava.Jinjava;
import java.util.Map;
public class Simple {
public static void main(String[] args) {
var jnj = new Jinjava();
Map<String, Object> context = Maps.newHashMap();
context.put("name", "John Doe");
String res = jnj.render("Hello {{ name }}!", context);
System.out.println(res);
}
}
我们打印一条简单的消息。
var jnj = new Jinjava();
创建了一个 Jinjava 对象。
Map<String, Object> context = Maps.newHashMap();
context.put("name", "John Doe");
我们创建一个上下文;它包含传递给模板引擎的数据。
String res = jnj.render("Hello {{ name }}!", context);
我们使用 render 方法渲染最终输出。它接受一个模板字符串和上下文对象。
从文件读取 Jinjava 模板
在下一个示例中,我们从文件中读取模板。
{{ name }} is a {{ occupation }}.
这是模板文件。
package com.zetcode;
import com.google.common.collect.Maps;
import com.hubspot.jinjava.Jinjava;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Map;
public class FromFile {
public static void main(String[] args) throws IOException {
var jnj = new Jinjava();
Map<String, Object> context = Maps.newHashMap();
context.put("name", "John Doe");
context.put("occupation", "gardener");
String fileName = "src/main/resources/message.jinja";
String template = Files.readString(Paths.get(fileName));
String res = jnj.render(template, context);
System.out.println(res);
}
}
我们使用 Files.readString 读取模板文件。
Map<String, Object> context = Maps.newHashMap();
context.put("name", "John Doe");
context.put("occupation", "gardener");
我们在上下文对象中传递两个变量。
Jinjava for 指令
for 指令用于迭代模板中的数据集合。
{% for word in words -%}
{{ word }}
{% endfor %}
在模板中,我们使用 for 指令来遍历 words 数据结构的元素。- 字符会去除空格字符。
package com.zetcode;
import com.google.common.collect.Maps;
import com.hubspot.jinjava.Jinjava;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;
import java.util.Map;
public class Words {
public static void main(String[] args) throws IOException {
var jnj = new Jinjava();
var words = List.of("sky", "rock", "small", "bed", "food", "warm");
Map<String, Object> context = Maps.newHashMap();
context.put("words", words);
String fileName = "src/main/resources/words.jinja";
String template = Files.readString(Paths.get(fileName));
String res = jnj.render(template, context);
System.out.println(res);
}
}
在该程序中,我们将单词列表传递给模板引擎。我们得到一个单词列表作为输出。
Jinjava 过滤器
可以将过滤器应用于数据以修改它们。过滤器在 | 字符后应用。
{% for word in words -%}
{{ word }} has {{ word | length }} characters
{% endfor %}
length 过滤器返回字符串的大小。
package com.zetcode;
import com.google.common.collect.Maps;
import com.hubspot.jinjava.Jinjava;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;
import java.util.Map;
public class WordsLen {
public static void main(String[] args) throws IOException {
var jnj = new Jinjava();
var words = List.of("sky", "rock", "small", "bed", "food", "warm");
Map<String, Object> context = Maps.newHashMap();
context.put("words", words);
String fileName = "src/main/resources/words.jinja";
String template = Files.readString(Paths.get(fileName));
String res = jnj.render(template, context);
System.out.println(res);
}
}
在该程序中,我们将单词列表传递给模板。我们打印每个单词及其大小。
Jinjava if 条件
可以使用 if/endif 指令创建条件。
{%- for task in tasks -%}
{% if task.done %}
{{ task.title }}
{% endif %}
{%- endfor %}
在模板文件中,我们使用 if 指令仅输出已完成的任务。
package com.zetcode;
public class Task {
private String title;
private boolean done;
public Task(String title, boolean done) {
this.title = title;
this.done = done;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public boolean isDone() {
return done;
}
public void setDone(boolean done) {
this.done = done;
}
}
这是 Task 类。
package com.zetcode;
import com.google.common.collect.Maps;
import com.hubspot.jinjava.Jinjava;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;
import java.util.Map;
public class Tasks {
public static void main(String[] args) throws IOException {
var jnj = new Jinjava();
var tasks = List.of(new Task("Task 1", true),
new Task("Task 2", true), new Task("Task 3", false),
new Task("Task 4", true), new Task("Task 5", false));
Map<String, Object> context = Maps.newHashMap();
context.put("tasks", tasks);
String fileName = "src/main/resources/tasks.jinja";
String template = Files.readString(Paths.get(fileName));
String res = jnj.render(template, context);
System.out.println(res);
}
}
我们从任务列表中生成一个输出。在输出中,我们仅包含已完成的任务。
来源
在本文中,我们介绍了 Jinjava 模板引擎。
作者
列出所有Java教程。