【问题标题】:Define and insert Thymeleaf fragments in TEXT templates在 TEXT 模板中定义和插入 Thymeleaf 片段
【发布时间】:2020-04-24 10:36:09
【问题描述】:

我正在尝试使用 Thymeleaf 创建纯文本和 HTML 格式的电子邮件模板。因为我不想复制公共部分,所以我想分别定义这些部分并将它们插入到更具体的模板中。

它适用于 HTML,但对于普通部分中的纯文本变量不会被替换:

HTML

  • common.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>
    
  • 具体的.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>
    

纯文本

  • header.txt

    Hello ${name}
    
  • 页脚.txt

    Bye
    
  • 具体的.txt

    [( ~{text/header} )]
    [( ${myLink} )]
    [( ~{text/footer} )]
    

结果

这一切都适用于 HTML,但对于纯文本版本,插入的 header.txt 模板中的 ${name} 变量不会被替换:

Hello, [#th:block th:utext="${name}"][/th:block]

    http://example.com

Bye.

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>

我的问题

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

【问题讨论】:

    标签: thymeleaf


    【解决方案1】:

    纯文本版本中的变量

    对于纯文本问题,您可以使用[#th:block] 语法。

    具体来说,不要在您的specific.txt 中使用它:

    [( ~{text/header} )]
    

    你可以用这个:

    [#th:block th:replace="text/header"][/th:block]
    

    另外,在header.txt 文件中,不要使用这个:

    Hello ${name}
    

    你需要使用这个:

    Hello [( ${name} )]
    

    这是表达式内联 - 您已经使用过 - 并提供 here,以供参考。

    [#th:block] 语法的一些其他示例显示在here

    为文本定义和使用片段

    您可能认为[#th:block] 语法现在允许我们以类似于 HTML 方法的方式使用片段。例如,像这样:

    DOES NOT WORK:
    [#th:block th:replace="text/common :: header"][/th:block]
    

    连同这样的common.txt 片段:

    ALSO DOES NOT WORK:
    [#th:block th:fragment="header"]
    Hello, [( ${name} )]
    [/th:block]
    

    如果你尝试这个,你会得到以下错误:

    java.lang.IllegalArgumentException:不能为使用 TEXT 模板模式的模板指定模板选择器:必须始终对整个模板文件执行模板插入操作,而不是片段

    一般评论

    如果您还没有看过或使用过它,我在这里唯一要提到的另一件事是parameterized fragments。它们可以使 HTML 片段更加灵活和可重用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-25
      • 2020-06-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多