Thymeleaf+Spring中含HTML特殊字符的客户端名称换行问题
解决方案
核心问题分析
你之前的处理顺序完全搞反了:先添加<br>再转义,导致<br>被转成了<br>,不管是HTML还是PDF都无法识别为换行。正确的逻辑应该是先转义HTML特殊字符,再插入换行标签。
方案一:Java代码端处理
- 优先转义原始字符串中的HTML特殊字符,避免破坏后续的HTML结构
- 对转义后的字符串,每12个字符插入
<br>标签 - 模板中直接用
th:utext渲染即可
示例代码:
// 原始客户端名称 String originalClient = "INVC _Client01 _Abcde_lkgyiop_ Kamal_nagar\"&'<>]a"; // 第一步:转义HTML特殊字符 String escapedClient = StringEscapeUtils.escapeHtml4(originalClient); // 第二步:每12字符插入<br>标签 String formattedClient = escapedClient.replaceAll("(.{12})", "$1<br>"); // 将formattedClient传入模板,模板中用th:utext="${formattedClient}"渲染
处理后各阶段结果:
- 转义后:
INVC _Client01 _Abcde_lkgyiop_ Kamal_nagar"&'<>]a - 添加
<br>后:INVC _Client<br>01 _Abcde_lk<br>gyiop_ Kamal<br>_nagar"&<br>'<>]a
模板用th:utext渲染后,HTML会正确解析<br>为换行,特殊字符也能正常显示,主流PDF生成工具也能识别该标签实现换行。
方案二:Thymeleaf模板端处理
如果不想在Java代码中处理,也可以在模板中完成转义+换行插入的流程:
<td> <div th:with="escapedClient=${#strings.escapeXml(row.get('client'))}"> <div th:utext="${escapedClient.replaceAll('(.{12})', '$1<br/>')}"></div> </div> </td>
- 先用
#strings.escapeXml转义HTML特殊字符(效果和StringEscapeUtils.escapeHtml4一致) - 再对转义后的字符串执行替换,插入
<br>标签 - 最后用
th:utext渲染,确保<br>被解析为换行
PDF适配补充
如果PDF生成工具(如Flying Saucer)仍不识别<br>,可以尝试两种替代方案:
- 用CSS设置容器的
white-space: pre-line,然后将<br>替换为换行符\n(Java或模板中替换时用$1\n) - 把每段12字符的内容包裹在
<p>标签中,利用段落自动换行:// Java端替换为<p>标签 String formattedClient = escapedClient.replaceAll("(.{12})", "<p>$1</p>");
内容的提问来源于stack exchange,提问作者Jagga
相关产品推荐
相关产品推荐

