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]
.
我正在尝试将一些旧的 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]
.