动态 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 变量名的主要内容,如果未能解决你的问题,请参考以下文章

freemarker - 带点的变量名

Freemarker 模板语言中的变量名

`name` 作为 freemarker 中断中的变量名

Java 使用模板生成 Word 文件---基于 Freemarker 模板框架

列出 Freemarker 模板中的所有变量

FreeMarker基础讲解