假设我们有一个简单的Freemarker宏:
<#macro myMacro expr>
<#local x=1>
${expr}
</#local>
<#local x=2>
${expr}
</#local>
</macro>
Run Code Online (Sandbox Code Playgroud)
<@myMacro“ A” />给出:
A A
我需要类似<@myMacro“ A $ {x}” />之类的东西:
A1 A2
但是在传递给宏之前,无法对$ {x}进行插值。即使我使用原始字符串r“ A $ {x}”作为参数,这也不起作用。
我试图玩?eval,但还没有结果(((
有可能做我所需要的吗?
您要在此处评估表达式还是模板片段?表达式类似于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>
Run Code Online (Sandbox Code Playgroud)
然后您可以将其用作:
<@myMacro r"A${x}" />
Run Code Online (Sandbox Code Playgroud)
甚至:
<@myMacro r"<ul><#list 1..x as i><li>${i}</li></#list><ul>" />
Run Code Online (Sandbox Code Playgroud)
无论如何,整个事情都是FreeMarker的一个奇怪用法,如果您非常依赖?interpret或?eval(例如,每个HTTP请求要处理数百个),您可能会发现它很慢。也就是说,Java标准的速度慢。
| 归档时间: |
|
| 查看次数: |
3854 次 |
| 最近记录: |