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
相关产品推荐
相关产品推荐

