我正在尝试使用动态名称设置变量。这意味着我的新变量的名称来自另一个变量:
<#-- in real world I wouldn't declare this variables right here -
they would come from somewhere else -->
<#assign varName = "myVarName"/>
<#assign varValue = "myVarValue/>
<#... set the variable .../>
这样可以按如下方式引用该值:
${myVarName} <#-- prints "myVarValue" -->
在Java指令中,我会使用
Environment#setVariable(String name, TemplateModel model)
实现这一目标。但有可能直接通过Freemarker实现这一目标吗?
答案 0 :(得分:4)
我遇到了类似的问题,Special Variable Reference页面帮助了我
vars:表达式.vars.foo返回与表达式foo相同的变量。如果由于某些原因必须使用方括号语法,则该选项很有用,因为该语法仅适用于哈希子变量,因此您需要一个人工父哈希。例如,要读取一个具有使FreeMarker混淆的陌生名称的顶级变量,您可以编写.vars [“一个陌生名称!”]。或者,要访问具有变量名varName的动态名称的顶级变量,您可以编写.vars [varName]。请注意,.vars返回的哈希值不支持?keys和?values。
在我的情况下,我只能在模型中使用字符串。我有一堆名字,例如Name1,Name2,... Name10。为了使用这些名称创建表格,我使用了以下代码:
<#list 1..10 as x>
<#if .vars["Name" + x]??>
<tr>
<td align="center">${.vars["Name" + x]}</td>
</tr>
</#if>
</#list>
答案 1 :(得分:2)
使用哈希。也就是说,使用变量的名称作为哈希的键。
答案 2 :(得分:1)
没有指令分配给具有动态名称的变量。但这是实现这一目标的黑客:
<@'<#assign ${varName} = varValue>'?interpret />
但这并不快。它涉及每次评估时的FTL解析。
答案 3 :(得分:0)