thymeleaf模板

thymeleaf模板


Thymeleaf 是一种现代化的 Java 模板引擎,主要用于在 web 应用中生成动态 HTML 内容。

1. thymeleaf的使用方法


1.1 引入thymeleaf依赖

  • maven
1
2
3
4
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

在此之前需要引入spring-boot-starter-web

1.2 创建 Thymeleaf 模板

Thymeleaf 模板文件通常放置在 src/main/resources/templates 目录下,文件格式为 .html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8"/>
<title>Thymeleaf Test</title>
<style>
body {
font-family: 'SimSun', sans-serif;
}
</style>
</head>
<body>

<h1>Hello, Thymeleaf!</h1>

<!-- 测试渲染一个变量 -->
<p th:text="'Welcome, ' + ${english} + '!'">Welcome, Guest!</p>
<p th:text="'欢迎, ' + ${chinese} + '!'">欢迎, Guest!</p>
</body>
</html>

[!TIP]

Thymeleaf对Html要求严格,注意标签严格闭合,尤其<meta charset="UTF-8"/>

1.3 向模板传值

1
2
3
4
5
6
7
8
9
@Override
public void renderByThymeleaf() {
Map<String,Object> varisblesMap = new HashMap<>();
varisblesMap.put("english","Camellia 中文测试");
varisblesMap.put("chinese","小花");
Context context = new Context();
context.setVariables(varisblesMap);
String thymeleaf = templateEngine.process("thymeleaf", context);
}

1.4 Thymeleaf 表达式

Thymeleaf 提供多种表达式来在模板中使用:

  • 文本替换th:text="${variable}",将 HTML 中的内容替换为变量值。
  • URL 替换th:href="@{/path}",用于生成动态 URL。
  • 条件判断th:if="${condition}",根据条件渲染内容。
  • 循环遍历th:each="item : ${items}",用于遍历集合。

到此使用Thymeleaf渲染Html就基本成功了,但是有时我们需要接受前端传来的数据,然后排版打印出来,如订单之类的。

2. HTML转PDF

2.1 添加依赖

1
2
3
4
5
6
7
8
9
10
<dependency>
<groupId>org.xhtmlrenderer</groupId>
<artifactId>flying-saucer-pdf</artifactId>
<version>9.1.22</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13.4</version>
</dependency>

2.2 将HTML转换为PDF

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
@Override
public void convertHtmlToPDF(String html) {
// 创建 ITextRenderer 对象,用于将 HTML 渲染为 PDF
ITextRenderer renderer = new ITextRenderer();
// 获取字体解析器,用于加载自定义字体
ITextFontResolver fontResolver = renderer.getFontResolver();
// 将 HTML 字符串设置为渲染文档
renderer.setDocumentFromString(html);
// 使用 try-with-resources 创建 FileOutputStream 将生成的 PDF 保存为 "thymeleaf.pdf"
try (OutputStream outputStream = new FileOutputStream("thymeleaf.pdf")) {
// 获取字体路径,simsun.ttc 是中文字体 SimSun (宋体) 的字体集
String fontPath = getClass().getResource("/static/font/simsun.ttc").getPath();
// 添加字体到渲染器,BaseFont.IDENTITY_H 表示使用 Unicode 编码,BaseFont.NOT_EMBEDDED 表示不嵌入字体
fontResolver.addFont(fontPath, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
// 布局渲染 HTML,准备生成 PDF
renderer.layout();
// 将布局后的内容生成 PDF,并输出到指定的文件流中
renderer.createPDF(outputStream);
} catch (IOException e) {
// 捕获并处理 IO 异常,如文件路径错误或文件无法创建等
e.printStackTrace();
} catch (com.lowagie.text.DocumentException e) {
// 捕获并处理 PDF 生成过程中的文档异常
e.printStackTrace();
}
}

2.3 注意事项

[!TIP]

  • 中文需要下载中文字体包,并在转换的时候添加进去。
  • 在前面的HTML模板也要指定所用的字体,否则即使添加了中文字体也不起作用。