我的天啊。
我看到了问题:代码是这样写的:
<#escape x as x?xml>
<#import "small.ftl" as my>
<@my.macro1/>
</#escape>
并且我假设 excape 将 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 创建类,并将所有必需的方法推迟到该类中。