我正在尝试使用 Thymeleaf 创建纯文本和 HTML 的电子邮件模板。因为我不想重复公共部分,所以我想单独定义这些部分并将它们插入到更具体的模板中。
它适用于 HTML,但对于公共部分中的纯文本变量不会被替换:
超文本标记语言
通用.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<div th:fragment="header">
<p>
Hello, [( ${name} )]
</p>
</div>
<div th:fragment="footer">
<p>
Bye.
</p>
</div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)具体.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<div th:replace="html/common::header"></div>
<p>
<a th:href="${myLink}">[( ${myLink} )]</a>
</p>
<div th:replace="html/common::footer"></div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)纯文本
标题.txt
Hello ${name}
Run Code Online (Sandbox Code Playgroud)页脚.txt
Bye
Run Code Online (Sandbox Code Playgroud)具体.txt
[( ~{text/header} )]
[( ${myLink} )]
[( ~{text/footer} )]
Run Code Online (Sandbox Code Playgroud)结果
这对于 HTML 来说效果很好,但对于纯文本版本,${name}插入header.txt模板中的变量不会被替换:
Hello, [#th:block th:utext="${name}"][/th:block]
http://example.com
Bye.
Run Code Online (Sandbox Code Playgroud)
HTML 结果看起来是正确的:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<div>
<p>
Hello, name-value
</p>
</div>
<p>
<a href="http://example.com">http://example.com</a>
</p>
<div>
<p>
Bye.
</p>
</div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
我的问题
对于纯文本问题,可以使用[#th:block]语法。
具体来说,不要在您的specific.txt:
[( ~{text/header} )]
Run Code Online (Sandbox Code Playgroud)
你可以使用这个:
[#th:block th:replace="text/header"][/th:block]
Run Code Online (Sandbox Code Playgroud)
另外,在header.txt文件中,不要使用以下内容:
Hello ${name}
Run Code Online (Sandbox Code Playgroud)
你需要使用这个:
Hello [( ${name} )]
Run Code Online (Sandbox Code Playgroud)
这是表达式内联 - 您已经使用过 - 并在此处呈现,以供参考。
这里[#th:block]提供了一些额外的语法示例。
您可能认为[#th:block]语法现在允许我们以与 HTML 方法类似的方式使用片段。例如,这样的事情:
DOES NOT WORK:
[#th:block th:replace="text/common :: header"][/th:block]
Run Code Online (Sandbox Code Playgroud)
连同common.txt这样的片段:
ALSO DOES NOT WORK:
[#th:block th:fragment="header"]
Hello, [( ${name} )]
[/th:block]
Run Code Online (Sandbox Code Playgroud)
如果您尝试这样做,您将收到以下错误:
java.lang.IllegalArgumentException:无法使用 TEXT 模板模式为模板指定模板选择器:模板插入操作必须始终在整个模板文件而不是片段上执行
如果您还没有看到或使用过它,我在这里要提到的唯一的另一件事是参数化片段。它们可以使 HTML 片段更加灵活和可重用。
| 归档时间: |
|
| 查看次数: |
2070 次 |
| 最近记录: |