2011-12-03 66 views
4

假設我們有一個簡單的Freemarker宏:如何評估Freemarker宏中的參數?

<#macro myMacro expr> 

    <#local x=1> 
     ${expr} 
    </#local> 

    <#local x=2> 
     ${expr} 
    </#local> 

</macro> 

< @myMacro 「A」/>給出:

一個 一個


我需要這樣的東西 < @myMacro「A $ {x}」/>應該給:

A1 A2

但是在傳遞到宏之前它不能像$ {x}那樣插值。 即使我使用原始字符串r「A $ {x}」作爲參數,這也不起作用。

我試着用?EVAL玩,但沒有結果,但(((

是否有可能做我需要?

回答

3

你想在這裏對錶達式,或者一個模板片段?表達式類似於1 + 2"A${x}"(注意引號;它是一個字符串文字),當您將它傳入時將看起來像<@myMacro "1 + 2" /><@myMacro r'"A${x}"' />;最後一個很尷尬。模板片段與<#list 1..x as i>${i}</#list>A${x}(請注意缺少引號),這更強大,看起來更好看,我看到了,你可能想要評估模板片斷,所以它應該是:

<#macro myMacro snippet> 
    <#-- Pre-parse it for speed --> 
    <#local snippet = snippet?interpret> 

    <#local x = 1> 
    <@snippet /> 

    <#local x = 2> 
    <@snippet /> 
</#macro> 

,然後你可以使用它作爲:

<@myMacro r"A${x}" /> 

甚至:

<@myMacro r"<ul><#list 1..x as i><li>${i}</li></#list><ul>" /> 

總之,整個事情是一個FreeMarker有點奇怪的用法,如果你非常依賴?interpret?eval(就像你每個HTTP請求做了數百次),你可能會發現它很慢。 Java標準緩慢,即。

+1

非常感謝!你的方法與「?解釋」是我可以接受的! 我對freemarker的使用比較特殊,我將它用於源代碼生成,因此「?interpret」的表現並不那麼重要。 – wilddev