可以使用自定义方言和属性处理器来处理此操作,而无需大量内联 SpEl 或 hack。
创建自定义属性处理器
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", "<br />");
}
@Override
public int getPrecedence()
{
return 10000;
}
}
您必须扩展AbstractUnescapedTextChildModifierAttrProcessor 处理器,否则您将获得<br /> 的html 实体标签,并且您实际上不会获得换行符。
创建自定义方言
要实现自定义方言,您需要这样的方言类:
public class MyCustomDialect extends AbstractDialect
{
@Override
public String getPrefix()
{
return "cd";
}
@Override
public Set<IProcessor> getProcessors()
{
final Set<IProcessor> 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 标记:
<div cd:nl2br="${myObject.myField}">MY MULTILINE FIELD</div>
有关实现自定义方言的更详尽指南,我推荐 Thymeleaf 文档: