2

あるフィールドに&シンボルがあり (db から、変更できない)、freemarker を介してこれを表示したいが、(freemarker から) 表示を読み取らせたい&場合、どうすればよいですか?

繰り返しますが、事前に値を変更することはできません (または、少なくとも変更したくありません)。

繰り返しになりますが、これは他の多くの xml と共に配置されている値です。値自体は、タグに囲まれて単独で表示されます...次のようなものです

<someTag>${wheeeMyValueWithAnAmpersand}<someTag>

その結果、すべてのアンパサンドをエスケープしたくありません。そうしないと、xml がおかしく見えます...補間の 1 つだけです。

4

2 に答える 2

2

なんてこった。

私は問題を見ます:コードは次のように書かれていました:

<#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/>      

出力は次のようになります。

&lt;test&gt;
m1: <test>
<test>
m2: &lt;test&gt;

ただし、ファイルをインポートすると、そうではなく、エスケープ... エスケープするようです!

解決策: 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 を使用してクラスを作成し、必要なすべてのメソッドをそれに任せるだけです。

于 2012-12-06T23:04:15.773 に答える