FreeMarker递归嵌套列表

时间:2017-07-12 11:18:42

标签: java freemarker

我有一个如下所示的数据结构:

public class Foo {
    public Bar bar;
    public List<Foo> foos = new ArrayList<>();
}

Foo的每个实例都可以保存任意数量的Foo S,当然这又可以包含更多Foo S等等。那么我将如何让FreeMarker通过这样的列表呢?

2 个答案:

答案 0 :(得分:3)

FreeMarker宏(和函数)支持递归。所以像这样:

<#macro dumpFoo foo>
  ${foo.bar}
  <#list foo.foos as childFoo>
    <@dumpFoo childFoo />
  </#list>
</#macro>

<@dumpFoo myFoo />

示例数据模型(使用http://try.freemarker.org/语法,但它与List - s和Foo bean同样有效:

myFoo = {
  "bar": "root",
  "foos": [
    {
      "bar": "child 1",
      "foos": [
        {
          "bar": "child 1.1",
          "foos": []
        }
      ]
    },
    {
      "bar": "child 2",
      "foos": []
    }
  ]
}

输出:

  root
  child 1
  child 1.1
  child 2

答案 1 :(得分:0)

您可以使用静态方法进行自由标记。

将静态方法添加到Foo类printMe或doSomething

add public static printMe() { ...
}

此功能将自行打印并根据需要打印列表。

现在只需从freemarker模板中调用它

${statics["packageName.Foo"].printMe()} 

请参阅Accessing static methods