动态 Freemarker 变量名
Posted
技术标签:
【中文标题】动态 Freemarker 变量名【英文标题】:Dynamic Freemarker variable name 【发布时间】:2014-07-28 00:21:14 【问题描述】:我正在尝试使用动态名称设置变量。这意味着我的新变量的名称来自另一个变量:
<#-- 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 来实现呢?
【问题讨论】:
【参考方案1】:没有分配给具有动态名称的变量的指令。但这里有一个 hack 来实现这一点:
<@'<#assign $varName = varValue>'?interpret />
但这并不是非常快。每次评估时都会涉及到 FTL 解析。
【讨论】:
谢谢,成功了。我为指令提交了功能请求 (sourceforge.net/p/freemarker/feature-requests/93)。【参考方案2】:使用哈希。即使用变量名作为哈希的key。
【讨论】:
感谢您的回答。我不确定你到底是什么意思。我真的需要能够通过编写 $myVarName 将新变量作为***变量访问。【参考方案3】:我遇到了类似的问题,Special Variable Reference 页面帮助了我:
vars:表达式 .vars.foo 返回与表达式 foo 相同的变量。如果由于某些原因您必须使用方括号语法,这很有用,因为它仅适用于哈希子变量,因此您需要人工父哈希。例如,要读取一个具有奇怪名称的***变量,这会使 FreeMarker 感到困惑,您可以编写 .vars["A奇怪名称!"]。或者,要访问由变量 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>
【讨论】:
【参考方案4】:我猜你可以这样做:
$myVarName?eval <#-- prints "myVarValue" -->
我从here 找到了答案,它对我有用。
【讨论】:
以上是关于动态 Freemarker 变量名的主要内容,如果未能解决你的问题,请参考以下文章