动态Freemarker变量名称

时间:2014-06-06 16:35:24

标签: variables freemarker

我正在尝试使用动态名称设置变量。这意味着我的新变量的名称来自另一个变量:

<#-- 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实现这一目标吗?

4 个答案:

答案 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)

我想您可以这样:

${myVarName?eval} <#-- prints "myVarValue" -->

我从here找到了答案,它对我有用。