Thymeleaf 是一个 Java 库。它是一个 XML/XHTML/HTML5 模板引擎,能够将一组转换应用于模板文件,以显示应用程序生成的数据和/或文本。
概述:
Thymeleaf 的主要目标是提供一种优雅且格式良好的模板创建方式。为了实现这一点,它基于定义在DOM(文档对象模型)上执行预定义逻辑的 XML 标记和属性,而不是将该逻辑显式编写为模板内的代码。
Thymeleaf 的架构允许快速处理模板,依赖于解析文件的智能缓存,以便在执行期间使用尽可能少的 I/O 操作。
Thymeleaf 可以处理的模板
- XML
- 有效的 XML
- XHTML
- 有效的 XHTML
- HTML5(主要)
总体架构
Thymeleaf 的核心是一个 DOM 处理引擎。具体来说,它使用自己的高性能 DOM 实现——而不是标准的 DOM API——来构建模板的内存树表示,然后它通过遍历它们的节点并在它们上执行处理器来操作,这些处理器根据当前配置和传递给模板用于其表示的数据集 — 称为上下文。
简单创建
- 创建模板引擎对象
- 创建解析对象
- 关联解析器对象到引擎对象上
- 提供给引擎模板本次解析的上下文对象
- 准备好要放入的 Context 对象
- 通过模板引擎生成最终的正文内容
- 填充响应内容
@WebServlet("/template-demo")
public class TemplateDemoServlet extends HttpServlet {
private static final long serialVersionUID = -8576662234303281900L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1. 创建模板引擎对象
TemplateEngine engine = new TemplateEngine();
// 2. 创建解析器对象
ServletContext servletContext = req.getServletContext();
ServletContextTemplateResolver resolver = new ServletContextTemplateResolver(servletContext);
resolver.setTemplateMode(TemplateMode.HTML);
resolver.setCharacterEncoding("utf-8");
resolver.setPrefix("/WEB-INF/templates/");
resolver.setSuffix(".html");
resolver.setCacheable(false);
// 3. 关联解析器对象到引擎对象上
engine.setTemplateResolver(resolver);
// 4. 提供给模板引擎本次解析的上下文对象
WebContext webContext = new WebContext(req, resp, servletContext);
// 5. 准备好要放入 Context 的数据
List<String> courseList = getCourseList();
webContext.setVariable("courseList", courseList);
// 6. 通过模板引擎生成最终的正文内容
String responseBody = engine.process("course-list", webContext);
// 7. 填充响应对象
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html");
resp.getWriter().println(responseBody);
}
private List<String> getCourseList() {
return Arrays.asList("JavaSE", "JavaDS", "JavaDB", "JavaWeb", "JavaTest", "JavaEE");
}
}
准备的模板示例:
<!doctype html>
<html lang="zh-hans" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>课程列表</title>
</head>
<body>
<h1> Java 方向的课程列表</h1>
<ol>
<li th:each="course : ${courseList}" th:text="${course}"></li>
</ol>
</body>
</html>
展示结果: