spring 如何在Thymeleaf中使用显示电子邮件地址< th:utext>?

qij5mzcb  于 2023-03-28  发布在  Spring
关注(0)|答案(1)|浏览(189)

我必须在thymeleaf中显示下面的文本,但它无法显示,也不确定原因和解决方案。
下面是来自JSON格式的文本,我正在解析这个json对象,并将其设置在POJO Entities中,以便Thymeleaf渲染。

我期待下面的输出:

如果我使用<span th:text="${comment.commentText}"></span>,电子邮件地址显示正常,但我失去了格式,这意味着无论换行符如何,所有内容都显示在一行中,但如果我使用<span th:utext="${comment.commentText}"></span>,thymeleaf无法呈现(在我的commentsText中没有电子邮件地址字段,thymeleaf通过使用th:utext来呈现文本)。

更新日期:

我尝试了andrewJames建议的解决方案,< and >用&lt;&gt;替换它可以替换电子邮件的括号,但无法显示thymeleaf中的换行符。
Java代码:

commentData.setCommentText(comment.replaceAll("(\r\n|\r|\n|\n\r)", "<br>")
                        .replaceAll("\t", "&nbsp;&nbsp;&nbsp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;")
                );

替换后,这是我的comment.getCommentText()数据

Entered comments: &lt;br&gt;&lt;br&gt;One &lt;br&gt;Two &lt;br&gt;&lt;br&gt;My Email: &lt;test@g.com&gt;

百里香叶码

<span th:utext="${commentText}"></span>

输出为:

如果在字符串变量replaceAll("<", "&lt;").replaceAll(">", "&gt;")的末尾添加额外的代码行,我不确定为什么<br>标记不能呈现
感谢您的时间和任何投入将不胜感激。

iklwldmw

iklwldmw1#

如果电子邮件地址是硬编码的,为什么不用途:

&lt;test@g.com&gt;

这将生成文本<test@g.com>
(no需要使用Thymeleaf在所有)。
如果电子邮件地址需要由模型属性提供,请将其放在span中-类似于:

<span th:text="|&lt;${email}&gt;|"></span>

它使用|...|作为字符串连接器。
您可以使用此<span>来获得所需的精确布局。
参考:有关&lt;等序列,请参见Which characters need to be escaped in HTML?
只是补充一下:如果你不需要使用th:utext,那么你应该避免使用它。如果你用它来显示用户提供的数据(任何你不能完全控制显示值的数据),它会带来安全漏洞。

更新

  • 基于对问题的补充说明。*

在本例中,您有一个完整的字符串。为了使用<>包围电子邮件地址,您需要做两件事:
1.将这些 * 特定的 * <>字符替换为它们的HTML转义码,* 在字符串 * 中,然后将其传递给Thymeleaf。
1.在Thymeleaf表达式中使用th:utext,以确保字符串中的 other HTML标记(如<br>)被处理为HTML而不是文本。
字符串变为:

Entered comments: <br>One <br> Two <br> My Email: &lt;test@g.com&gt;

Thymeleaf是这样的:

<div th:utext="${comment.commentText}"></div>

如何替换这两个特定的<>字符取决于您-有各种可能性。
假设你(大概)需要解析JSON,然后才能通过Thymeleaf呈现它的内容,那么你就可以在那时进行替换。
Java正则表达式替换是一种方法:

.*(<).*(>)

然后,您可以定位字符串末尾的这两个捕获组((<)(>)),并用它们的HTML转义序列替换它们。

但问题中没有显示相关代码,因此这是推测。

如果解决方案不明显,我建议针对新的具体步骤提出一个新的、具体的、有重点的问题(我这样说是因为它显著改变了你最初在这里提出的问题,因此应该是一个新问题)。
也许这将为您指出一个可能的方向(我相信还有许多其他方法也可以工作):

final String string = "Entered comments: <br>One <br> Two <br> My Email: <test@g.com>";
// separates the final < and > characters (creates 4 groups overall):
final String regex = "(.*)(<)(.*)(>)";
// replaces group $2 (final <) and group $4 (final >) with the HTML escape characters:
final String subst = "$1&lt;$3&gt;";
final Pattern pattern = Pattern.compile(regex);
final Matcher matcher = pattern.matcher(string);
final String result = matcher.replaceAll(subst);
// result: "Entered comments: <br>One <br> Two <br> My Email: &lt;test@g.com&gt;"
System.out.println(result);

相关问题