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

Freemarker - dynamic name for user-defined directive invocation

我正在尝试将一些旧的 Apache Tiles 内容移植到 Freemarker,而 tiles 代码所做的其中一件事是传递带有 tiles 名称的变量(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 指令,但是有没有办法通过宏调用来做到这一点——动态选择要在运行时调用的宏名称?

像这样:

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

解释:

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