确保在StringTemplate中转义HTML实体的最佳方法是什么

假设以下字符串模板,正在给出一个Java Bean对象列表:

    $people:{p|
  • $p.name$ $p.email
  • }$

即人员列表可能包含您可能或可能无法增强/扩展的Person对象:

 class Person { .... public getName() { ... } public getEmail() { ... } } 

getName()getEmail()方法不返回已清理的(转义的html实体)。 你怎么解决这个问题?

您可以使用自定义渲染器,例如:

 public static class HtmlEscapeStringRenderer implements AttributeRenderer { public String toString(Object o, String s, Locale locale) { return (String) (s == null ? o : StringEscapeUtils.escapeHtml((String) o)); } } 

然后在模板中指示您希望它被转义:

 $p.name;format="html"$ 

也就是说,您可能更喜欢在输入时擦除数据,在发送到模板之前进行转换,将装饰人员发送到模板等。


 public class App { public static void main(String[] args) { STGroupDir group = new STGroupDir("src/main/resource", '$', '$'); group.registerRenderer(String.class, new HtmlEscapeStringRenderer()); ST st = group.getInstanceOf("people"); st.add("people", Arrays.asList( new Person("Dave", "dave@ohai.com"), new Person("Nick", "nick@kthxbai.com") )); System.out.println(st.render()); } public static class HtmlEscapeStringRenderer implements AttributeRenderer { public String toString(Object o, String s, Locale locale) { return (String) (s == null ? o : StringEscapeUtils.escapeHtml((String) o)); } } } 

这输出:

 
  • <b>Dave</b> dave@ohai.com
  • <b>Nick</b> nick@kthxbai.com

没有必要为此编写自己的渲染器。 您可以使用内置渲染器org.stringtemplate.v4.StringRenderer

 group.registerRenderer(String.class, new StringRenderer()); 

并添加您的模板:

 
    $people:{p|
  • $p.name;format="xml-encode"$ $p.email;format="xml-encode"$
  • }$