我正在尝试将一些旧的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
指令,但是有什么方法可以通过宏调用来做到这一点-动态选择要在运行时调用的宏名称吗?
答案 0 :(得分:3)
赞:
<@.vars["my${which}thing"] />
说明:
<#macro m>...</#macro>
只是将宏(宏是值)分配给变量m
<@m />
中,m
部分被解释为常规表达式。在这种情况下,它恰好是一个简单的变量引用表达式,但它也可能是一个更复杂的表达式(不过,可能需要在其周围加上括号)。.vars
散列来读取,例如.vars[nameExpression]
。