Freemarker-用户定义的指令调用的动态名称

时间:2019-02-08 17:31:03

标签: freemarker

我正在尝试将一些旧的Apache Tiles内容移植到Freemarker,tile代码的作用之一是传递带有tile名称(或多或少的jsp文件)的变量。这些变量在运行时决定将哪些模板转换为当前模板。

我试图弄清楚Freemarker宏是否有办法做到这一点。像这样:

<#macro mything>
test
</#macro>

<#macro myotherthing>
other
</#macro>

<@"my${which}thing" />

如果which="other",则结果应为

other

如果为which="",则结果应为:

test

但是,我得到一个错误:

Syntax error in nameless template in line 9, column 12:
Encountered "}", but was expecting one of:
    "."
    ".."
    <DOT_DOT_LESS>
    "..*"
    "?"
    "??"
    "!"
    ","
    ":"
    "["
    "("
    <TERMINATING_EXCLAM>

我猜测用户定义的指令调用不能是表达式或某种东西。我想我可以改用include指令,但是有什么方法可以通过宏调用来做到这一点-动态选择要在运行时调用的宏名称吗​​?

1 个答案:

答案 0 :(得分:3)

赞:

<@.vars["my${which}thing"] />

说明:

  • <#macro m>...</#macro>只是将宏(宏是值)分配给变量m
  • <@m />中,m部分被解释为常规表达式。在这种情况下,它恰好是一个简单的变量引用表达式,但它也可能是一个更复杂的表达式(不过,可能需要在其周围加上括号)。
  • 具有动态名称的变量可以通过保留的.vars散列来读取,例如.vars[nameExpression]