You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Thymeleaf的th:utext正确显示带换行的邮箱地址?

解决方案:Thymeleaf渲染带换行和邮箱的文本问题

问题根因

你当前的字符串处理顺序错误:先将换行替换为<br>标签,再转义所有<和>,导致需要渲染为换行的<br>被转成了&lt;br&gt;纯文本,自然无法触发换行;而邮箱的尖括号虽然被正确转义,但换行功能失效。


方法一:调整Java端文本处理顺序

先转义用户输入中的XML特殊字符(避免XSS风险,同时正确显示邮箱尖括号),再替换换行和制表符为HTML格式标签/实体。这样我们手动添加的<br>和&nbsp;不会被转义,能被Thymeleaf正确解析。

Java代码示例

// 引入Apache Commons Text工具类(推荐,覆盖所有XML特殊字符转义)
import org.apache.commons.text.StringEscapeUtils;

// 处理流程:先转义原始文本,再替换格式符号
String escapedComment = StringEscapeUtils.escapeXml11(comment);
String formattedComment = escapedComment
    .replaceAll("(\r\n|\r|\n|\n\r)", "<br>")
    .replaceAll("\t", "&nbsp;&nbsp;&nbsp;");

commentData.setCommentText(formattedComment);

如果不想引入第三方依赖,也可以手动转义核心特殊字符,但工具类更可靠:

String escapedComment = comment
    .replaceAll("&", "&amp;")
    .replaceAll("<", "&lt;")
    .replaceAll(">", "&gt;")
    .replaceAll("\"", "&quot;")
    .replaceAll("'", "&apos;");

// 后续替换换行和制表符步骤同上

Thymeleaf模板代码

保持使用th:utext渲染处理后的文本:

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

方法二:直接在Thymeleaf模板中处理

将原始文本保留在POJO中,通过Thymeleaf内置工具类完成转义和格式替换,减少Java端逻辑:

Thymeleaf代码示例

<span th:utext="${#strings.replaceRegex(#strings.replaceRegex(#strings.escapeXml(comment.commentText), '(\r\n|\r|\n)', '<br>'), '\t', '&nbsp;&nbsp;&nbsp;')}"></span>

拆分逻辑说明:

  1. #strings.escapeXml():转义用户输入中的XML特殊字符,确保邮箱尖括号显示正常
  2. #strings.replaceRegex():将所有换行符替换为<br>标签
  3. 再次使用replaceRegex():将制表符替换为多个空格实体

效果验证

处理后,邮箱<test@g.com>会被转义为&lt;test@g.com&gt;,通过th:utext渲染后显示为<test@g.com>;换行符被替换为<br>标签,会被解析为换行,同时避免了XSS注入风险。

内容的提问来源于stack exchange,提问作者Veera

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 08:12:33