Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 确保在StringTemplate中转义HTML实体的最佳方法是什么_Java_Stringtemplate_Stringtemplate 4 - Fatal编程技术网

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

Java 确保在StringTemplate中转义HTML实体的最佳方法是什么,java,stringtemplate,stringtemplate-4,Java,Stringtemplate,Stringtemplate 4,假设使用以下字符串模板,将获得Java Bean对象列表: <ul>$people:{p|<li>$p.name$ $p.email</li>}$</ul> getName()和getEmail()方法不会返回经过清理的(转义的html实体)。如何解决此问题?您可以使用自定义渲染器,例如: 公共静态类HtmlEscapeStringRenderer实现AttributeRenderer{ 公共字符串toString(对象o、字符串s、区域设置){

假设使用以下字符串模板,将获得Java Bean对象列表:

<ul>$people:{p|<li>$p.name$ $p.email</li>}$</ul>

getName()
getEmail()
方法不会返回经过清理的(转义的html实体)。如何解决此问题?

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

公共静态类HtmlEscapeStringRenderer实现AttributeRenderer{
公共字符串toString(对象o、字符串s、区域设置){
return(String)(s==null?o:StringEscapeUtils.escapeHtml((String)o));
}
}
然后在模板中指出您希望它转义:

$p.name;format="html"$
也就是说,您可能更喜欢在输入时删除数据、在发送到模板之前进行转换、向模板发送修饰人员等


公共类应用程序{
公共静态void main(字符串[]args){
STGroupDir group=newstgroupdir(“src/main/resource”、“$”、“$”);
registerRenderer(String.class,新的HtmleCapeStringRenderer());
ST=group.getInstanceOf(“人”);
st.add(“人”,Arrays.asList)(
新人(“戴夫”dave@ohai.com"),
新人(“尼克”nick@kthxbai.com")
));
System.out.println(st.render());
}
公共静态类HtmlEscapeStringRenderer实现AttributeRenderer{
公共字符串toString(对象o、字符串s、区域设置){
return(String)(s==null?o:StringEscapeUtils.escapeHtml((String)o));
}
}
}
这将产生:

<ul><li>&lt;b&gt;Dave&lt;/b&gt; dave@ohai.com</li><li>&lt;b&gt;Nick&lt;/b&gt; nick@kthxbai.com</li></ul>
  • b保存/bdave@ohai.com
  • b单击/bnick@kthxbai.com

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

group.registerRenderer(String.class, new StringRenderer());
并在模板中添加:

<ul>$people:{p|<li>$p.name;format="xml-encode"$ $p.email;format="xml-encode"$</li>}$</ul>
    $people:{p|
  • $p.name;format=“xml encode”$$p.email;format=“xml encode”$
  • }$

谢谢!尽管如此,我认为最好是“视图”层处理输出介质(在本例中为html)的格式化/转义。不确定如何“注册”渲染器。从doco's看不清楚?@Jacob很清楚,但我认为这取决于你如何使用ST。我已经添加了我的代码,但它可能直接适用,也可能不直接适用。@Jacob not Show是一个“js”转义器,基于渲染器的
s
参数(在
format=
之后传入的字符串)。按照我想要的方式工作非常令人沮丧——我对该库完全不熟悉。到目前为止,我更喜欢其他模板解决方案,但这在很大程度上是由于无知。我使用StringTemplate已经有一段时间了。它已经成为我选择的模板工具。你表示你更喜欢其他诱人的解决方案?我想知道是哪一个。(我真的很喜欢ST,主要是因为它在防止模板文件中出现逻辑方面做了很多限制。)对我来说很有用。应该是“xml编码”,而不是“xml编码”
group.registerRenderer(String.class, new StringRenderer());
<ul>$people:{p|<li>$p.name;format="xml-encode"$ $p.email;format="xml-encode"$</li>}$</ul>