Thymeleaf:用<br>替换换行符

dom*_*nik 11 java spring spring-mvc thymeleaf

我有一个<textarea name="desc" />可能包含换行符的field(),我想用它们的HTML替换它们:<br />.我怎样才能做到这一点?我正在使用Thymeleaf 2.1.4.RELEASE.

hol*_*s83 12

正如dominik所述,\n对于换行不起作用.但是,你可以使用&#10;.

${#strings.replace(desc,'&#10;','&lt;br&gt;')}
Run Code Online (Sandbox Code Playgroud)

或者通过转义来防止代码注入:

${#strings.replace(#strings.escapeXml(desc),'&#10;','&lt;br&gt;')}
Run Code Online (Sandbox Code Playgroud)

  • 只是为了帮助别人.&#10; 是LineFeed字符的ASCII.它像一个魅力:) (2认同)

dom*_*nik 9

与在JSP中一样,不可能使用简单直接的方法

${#strings.replace(desc, '\n', '<br />')}
Run Code Online (Sandbox Code Playgroud)

至少有两个问题:

  • '\n'被底层表达式语言(在我的情况下是SpEL,因为我使用的是Spring MVC)处理为字符串文字,由两个独立的字符组成:'\'和'n'而不是单个换行符
  • 由于Thymeleaf底层XML解析器不允许放置<>内部表达式,因此抛出异常

我找到的第一个问题的解决方案是在控制器中设置换行符并将其传递给视图.

为了解决您需要使用第二个问题&lt;,而不是<&gt;代替>.还记得这意味着使用th:utext而不是th:text

// in controller:
model.addAttribute("newLineChar", '\n');

// in view
${#strings.replace(desc, newLineChar, '&lt;br /&gt;')}
Run Code Online (Sandbox Code Playgroud)

如果您正在使用Thymeleaf + Spring(这意味着Thymeleaf将使用SpEL而不是OGNL),您也可以使用SpEL T operator.这样您就不必在控制器中声明换行变量,但在这种情况下请注意换行符分隔符会因应用程序运行的操作系统而异:

${#strings.replace(desc, T(System).getProperty('line.separator'), '&lt;br /&gt;')}
Run Code Online (Sandbox Code Playgroud)

我最终将使用的是上述+ Apache StringUtils的组合,它定义了public static final String LF = "\n";:

${#strings.replace(desc, T(org.apache.commons.lang3.StringUtils).LF, '&lt;br /&gt;')}
Run Code Online (Sandbox Code Playgroud)

  • 真的吗?这对我不起作用,做一些琐碎的事情看起来很复杂 (2认同)