なんてこった。
私は問題を見ます:コードは次のように書かれていました:
<#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 を使用してクラスを作成し、必要なすべてのメソッドをそれに任せるだけです。