如果我在某个字段中有&
符号(来自数据库,无法更改),我想通过freemarker显示这个...但是显示(来自freemarker)读取{{1}这样做的方法是什么?
重申一下,我不能事先改变价值(至少,我不想),我希望freemarker能够“取消标记”&。
要重复迭代,这是一个使用其他xml的 lot 放置的值。值本身单独显示,由标签包围......所以类似
&
因此,我不希望所有&符号被转义,或者xml看起来很有趣......只是插值中的那个。
答案 0 :(得分:2)
我看到了问题:代码是这样编写的:
<#escape x as x?xml>
<#import "small.ftl" as my>
<@my.macro1/>
</#escape>
并且我假设excape会超越其中的所有调用 - 这肯定是文档的含义
http://freemarker.org/docs/ref_directive_escape.html
<#assign x = "<test>"> m1>
m1: ${x}
</#macro>
<#escape x as x?html>
<#macro m2>m2: ${x}</#macro>
${x}
<@m1/>
</#escape>
${x}
<@m2/>
输出将是:
<test>
m1: <test>
<test>
m2: <test>
然而,当您导入文件时,似乎不是这种情况,并且转义......逃脱!
解: http://watchitlater.com/blog/2011/10/default-html-escape-using-freemarker/
以上链接详细说明了如何解决问题。实际上,它归结为加载一个不同的FreemakerLoader,一个用转义标记包装所有模板。
class SomeCoolClass implements TemplateLoader {
//other functions here
@Override
public Reader getReader(Object templateSource, String encoding) throws IOException {
Reader reader = delegate.getReader(templateSource, encoding);
try {
String templateText = IOUtils.toString(reader);
return new StringReader(ESCAPE_PREFIX + templateText + ESCAPE_SUFFIX);
} finally {
IOUtils.closeQuietly(reader);
}
}
这是上面链接的摘录。使用现有的templateLoader创建类,并将所有必需的方法推迟到该。
答案 1 :(得分:2)
从FreeMarker 2.3.24开始,不再需要TemplateLoader
“hack”。有一个名为output_format
的设置,它指定是否需要转义和转义。可以使用template_configurations
设置全局配置和/或按模板名称模式配置。这样做的推荐方法更简单(来自手册):
[...]如果
recognize_standard_file_extensions
设置为true
(即{。}} 默认情况下,incompatible_improvements
设置为2.3.24或 更高),源名称以“.ftlh”结尾的模板获取“HTML” 输出格式,以及“.ftlx”获取“XML”输出格式