如何评估Freemarker宏中的参数?

时间:2011-12-03 12:01:49

标签: freemarker

假设我们有一个简单的Freemarker宏:

<#macro myMacro expr>

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

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

</macro>

&lt; @myMacro“A”/&gt;给出:

一个 甲


我需要类似的东西 &lt; @myMacro“A $ {x}”/&gt;应该给:

A1 A2

但在传入宏之前插入$ {x}不起作用。 即使我使用原始字符串r“A $ {x}”作为参数,这也不起作用。

我尝试使用?eval,但还没有结果((

有可能做我需要的吗?

1 个答案:

答案 0 :(得分: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标准慢,即。