假设我们有一个简单的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,但还没有结果((
有可能做我需要的吗?
答案 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标准慢,即。