Thymeleaf:用替换换行符
我有一个字段( ),可能包含换行符,我想用它们的HTML替换它们:
。 我怎样才能做到这一点? 我正在使用Thymeleaf 2.1.4.RELEASE。
正如dominik所述 , \n
for换行不起作用。 但是,您可以使用
。
${#strings.replace(desc,'
','<br>')}
或者通过转义来防止代码注入:
${#strings.replace(#strings.escapeXml(desc),'
','<br>')}
与在JSP中一样 ,不可能使用简单直接的方法
${#strings.replace(desc, '\n', '
')}
至少有两个问题:
- ‘\ n’被底层表达式语言(在我的情况下是SpEL,因为我正在使用Spring MVC)处理为字符串文字,由两个独立的字符组成:’\’和’n’而不是单个换行符
- 抛出exception,因为Thymeleaf底层XML解析器不允许在表达式中放入
<
和>
我找到的第一个问题的解决方案是在控制器中设置换行符并将其传递给视图。
要解决您需要使用的第二个问题<
而不是<
和>
而不是>
。 还记得这意味着使用th:utext
而不是th:text
// in controller: model.addAttribute("newLineChar", '\n'); // in view ${#strings.replace(desc, newLineChar, '<br />')}
如果您正在使用Thymeleaf + Spring(这意味着Thymeleaf将使用SpEL而不是OGNL),您也可以使用SpEL T operator
。这样您就不必在控制器中声明换行符,但要注意换行符中的换行符这种情况会因应用程序运行的操作系统而异:
${#strings.replace(desc, T(System).getProperty('line.separator'), '<br />')}
我最终将要使用的是上述+ Apache StringUtils的组合,它定义了public static final String LF = "\n";
:
${#strings.replace(desc, T(org.apache.commons.lang3.StringUtils).LF, '<br />')}
使用自定义方言和属性处理器来执行此操作可以在没有大量内联SpEl或黑客的情况下执行此操作。
创建自定义属性处理器
public class NewlineAttrProcessor extends AbstractUnescapedTextChildModifierAttrProcessor { public NewlineAttrProcessor() { super("nl2br"); } @Override protected String getText(Arguments arguments, Element element, String attributeName) { final Configuration configuration = arguments.getConfiguration(); final IStandardExpressionParser parser = StandardExpressions.getExpressionParser(configuration); final String attributeValue = element.getAttributeValue(attributeName); final IStandardExpression expression = parser.parseExpression(configuration, arguments, attributeValue); final String value = (String)expression.execute(configuration, arguments); return StringUtils.replace(value, "\n", "
"); } @Override public int getPrecedence() { return 10000; } }
您必须扩展AbstractUnescapedTextChildModifierAttrProcessor
处理器,否则您将获得
的html实体标记,并且您实际上不会获得换行符。
创建自定义方言
要实现自定义方言,您需要一个方言类,如下所示:
public class MyCustomDialect extends AbstractDialect { @Override public String getPrefix() { return "cd"; } @Override public Set getProcessors() { final Set processors = new HashSet<>(); processors.add(new NewlineAttrProcessor()); return processors; } }
getPrefix
方法返回值是您用来调用您所做的任何自定义处理器的值。 例如,Thymeleaf使用th
。 我们在上面实现的自定义处理器正在寻找nl2br
所以要调用它你将使用cd:nl2br
属性而不是th:text
。
注册你的新方言
在您的主类中,您只需要创建一个将返回您的方言类的新实例的@Bean
。
@SpringBootApplication public class MyApplication { public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); } @Bean public MyCustomDialect myCustomDialect() { return new MyCustomDialect(); } }
使用自定义处理器
最后,在您的模板文件中,您将拥有如下HTML标记:
有关实施自定义方言的更全面指南,我建议使用Thymeleaf文档:
- 在5分钟内延长Thymeleaf
- 在另外5分钟内进一步延长Thymeleaf
- 使用eclipse-plugin包将java插件转换为maven项目
- Java – ArrayList元素的排列(整数) – 无法使其正常工作
- java:尝试finally块执行
- 如何在GroupLayout Java中设置Jframe背景图像
- javadoc 1.5和1.6中缺少enum.valueOf(String name)
- 如何在java或groovy中查找两个日期之间的天数?
- RestTemplate to NOT escape url
- Java:在循环中实例化变量:好的还是坏的样式?
- java.lang.IllegalArgumentException:当我使用reflection时,object不是声明类的实例