使用Thymeleaf渲染片段内容

时间:2017-08-28 23:06:28

标签: java thymeleaf html-email

我尝试使用Thymeleaf呈现电子邮件模板,我希望将主题和正文放在同一个文件中,但需要单独呈现。我不想使用弹簧视图,只是简单的SpringTemplateEngine

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<!--/*@thymesVar id="user" type="com.myapp.user.User"*/-->
<!--/*@thymesVar id="invitationId" type="java.util.UUID"*/-->
<head>
    <title th:fragment="subject">Hello <span th:text="${user.name}"/></title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
</head>
<body>
<p>
    Hello <span th:text="${user.name}"></span>,<br>
    you've been invited to join MyApp.
</p>
<p>
    Click on the following link to confirm your email and setup a password:<br>
    <a th:href="@{https://myapp.com/accept-invitation(id=${invitationId})}">Accept invitation</a>
</p>
<p>
    Best regards,<br/>
    <em>The MyApp team</em>
</p>
</body>
</html>

这个有几个问题

首先,我无法让Thymeleaf仅呈现<title>的内容

String subject = templateEngine.process(
    templateFile,
    ImmutableSet.of("subject"),
    new Context(Locale.ENGLISH, contextVariables)
);

它仅呈现文学作品Hello - 看起来始终会删除开始<title>标记,并且片段在第一个标记之后立即修剪。

当我渲染整个模板时,它会返回

<!DOCTYPE html>
<html>
<head>
    Hello <span>pepa</span></title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
</head>
<body>
<p>
    Hello <span>pepa</span>,<br>
...

<title>中使用以下内容可使输出更好

<span th:text="${user.name}" th:remove="tag"></span>

但开场标签仍然缺失。

当我理论上成功地正确呈现标题时,我仍然将它包装在HTML标签中 - 这显然不能用作电子邮件主题。有没有办法只渲染片段的内容?

我真的希望将电子邮件主题和正文放在同一模板中用于案例,例如我想在标题中进行一些迭代以从列表中生成它 - 我不想做任何字符串连接,我想在模板中使用它。

有什么建议吗?

1 个答案:

答案 0 :(得分:-1)

如果您只想包含片段的内容,假设您的片段名为 your_fragment.html ,并且位于 / resources / templates / fragments 下,则可以做:

EventTrigger

和your_fragment.html:

        Uri lvUri = FileProvider.getUriForFile(pActivity, BuildConfig.APPLICATION_ID + ".provider", pFile);
    Intent intent = new Intent(pAction);

    intent.putExtra(Intent.EXTRA_EMAIL, new String[] {  });
    intent.putExtra(Intent.EXTRA_SUBJECT, "EXTRA_SUBJECT");
    intent.putExtra(Intent.EXTRA_TEXT, "EXTRA_TEXT");
    intent.putExtra(Intent.EXTRA_STREAM, lvUri);
    intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    intent.setType("application/xml");

这将呈现:

<head>
  <title th:replace="fragments/your_fragment::your_fragment"/></title>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
</head>