【问题标题】:FreeMarker get variable value by concatenating another variable valueFreeMarker 通过连接另一个变量值来获取变量值
【发布时间】:2016-01-31 17:59:21
【问题描述】:
public class Main {
    public static void main(String[] args) throws IOException, TemplateException{
        Configuration freemarkerConfig = new Configuration();
        freemarkerConfig.setClassForTemplateLoading(Main.class, "");
        Template template = freemarkerConfig.getTemplate("template.ftl");

        Map<String, String> data = new HashMap<String, String>();

        for(int i=1;i<=10;i++){
           data.put("map_"+i, "value"+i);
        }
        Writer out = new StringWriter();
        template.process(data, out);
        System.out.println(out.toString());
    }
}

这是我访问变量的 FTL 代码:

<#assign containerIndex=1>
${map_containerIndex} 
This gives error
I want to evaluate ${map_1}

【问题讨论】:

    标签: java freemarker templating


    【解决方案1】:

    您可以读取具有此类运行时生成名称的变量,例如.vars['map_' + i]。这与汤姆在他的回答中使用的技巧相同,但适用于读取顶级变量。

    【讨论】:

    • 可以说我的返回类型是 Object .vars['map_' + i].name 是否可以使用此方法
    • 我不明白你的问题,但无论如何.vars[...] 只是一个表达式,它给你任何类型的值。它没有什么特别之处。
    【解决方案2】:

    我建议为模板提供一个数组,而不是尝试创建一个变量(我认为这是不可能的)。

    像这样

    String[] stringArray = new String[11];
    for (int i = 1; i<= 10; i++) {
        stringArray[i] = "value"+i;
    }
    data.put("map", stringArray);
    

    Freemarker 中的访问应该是这样的

    <#assign containerIndex=1>
    ${map[containerIndex]}
    

    或类似的东西,不能在atm试一试

    另请注意,以 1 开始 for 循环(如您的示例中所示)将不会使用第一个数组槽。

    我建议

    String[] stringArray = new String[10];
    for (int i = 0; i < 10; i++) {
        stringArray[i] = "value"+i;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-28
      • 1970-01-01
      • 2020-04-21
      • 1970-01-01
      相关资源
      最近更新 更多