确保在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"$
}$