2011-12-03 156 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