FreeMarker 递归嵌套列表

FreeMarker recursive nested lists

我的数据结构如下所示:

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

Foo 的每个实例都可以包含任意数量的 FooS,当然这反过来又可以包含更多的 FooS 等等。那么我将如何让 FreeMarker 遍历这样的列表?

你可以使用静态方法来freemarker。

向 Foo 添加静态方法 class printMe 或 doSomething

add public static printMe() { ...
}

此函数将自行打印并根据需要打印列表。

现在只需从 freemarker 模板调用它

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

Accessing static methods

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