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

Spring Thymeleaf控制器传多行文本至模板的前端换行显示问题

嘿,这个场景我太熟悉了!HTML默认会把文本里的换行和连续空格合并成一个空格,所以直接用th:utext渲染自然挤成一行。给你三个实用的解决方案,按需选就行:

方法1:用CSS快速解决(最省事)

不用改后端代码,只需要给渲染消息的<p>标签加个CSS样式,让它识别换行符:

<p th:utext="${successMessage}" style="white-space: pre-line;"></p>

white-space: pre-line的作用是保留文本里的换行符,同时自动合并多余的空格,完美适配你这种动态条目数量的情况,前端会自动按原文本的换行显示。

方法2:后端把换行转成HTML换行标签

如果更倾向于在后端处理,你可以把文本里的\n替换成HTML的<br>标签,然后用th:utext解析:

// 控制器里的代码修改
String message = "item A \n item B \n Item C \n Item D";
// 把换行符替换成HTML换行标签
message = message.replace("\n", "<br>");
modelAndView.addObject("successMessage", message);

模板里还是原来的写法:

<p th:utext="${successMessage}"></p>

⚠️ 注意:如果这个消息包含用户输入的内容,要警惕XSS风险,建议先做转义处理;如果是你自己生成的固定格式消息,就不用担心。

方法3:转成列表渲染(更美观)

既然是条目类内容,用列表展示视觉效果会更好,尤其条目多的时候:
首先在后端把字符串拆成列表:

// 控制器代码
String message = "item A \n item B \n Item C \n Item D";
// 按换行符拆分,同时过滤空字符串和去除前后空格
List<String> itemList = Arrays.stream(message.split("\n"))
                              .map(String::trim)
                              .filter(s -> !s.isEmpty())
                              .collect(Collectors.toList());
modelAndView.addObject("itemList", itemList);

然后在Thymeleaf里循环生成列表:

<ul>
  <li th:each="item : ${itemList}" th:text="${item}"></li>
</ul>

这样每个条目都是独立的列表项,自动换行还带项目符号,可读性更强。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:04:33