在 TEXT 模板中定义并插入 Thymeleaf 片段

bas*_*joe 4 thymeleaf

我正在尝试使用 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)

纯文本

结果

这对于 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)

我的问题

  • 对于纯文本版本有优雅的解决方案吗?
  • 有没有办法为文本 Thymeleaf 模板定义和使用片段?
  • 有什么一般性建议,因为我才开始使用 Thymeleaf?

and*_*mes 5

纯文本版本中的变量

对于纯文本问题,可以使用[#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 片段更加灵活和可重用。