【问题标题】:Dynamic Freemarker variable name动态 Freemarker 变量名
【发布时间】: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 来实现呢?

【问题讨论】:

    标签: variables freemarker


    【解决方案1】:

    没有分配给具有动态名称的变量的指令。但这里有一个 hack 来实现这一点:

    <@'<#assign ${varName} = varValue>'?interpret />
    

    但这并不是非常快。每次评估时都会涉及到 FTL 解析。

    【讨论】:

    【解决方案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 找到了答案,它对我有用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-08
        • 1970-01-01
        • 1970-01-01
        • 2011-05-12
        • 2020-11-04
        • 2014-07-09
        • 2010-10-20
        • 1970-01-01
        相关资源
        最近更新 更多