【问题标题】:Freemarker: Accessing elements in a list, which is in a listFreemarker:访问列表中的元素,列表中
【发布时间】:2017-07-31 15:05:39
【问题描述】:

我目前有以下结构:

List<List<ClusterEntry>> clusters = new ArrayList<List<ClusterEntry>>();
//fill clusters and the list in clusters
input.put("clusters", clusters);

clusters 描述了我的集群,而 cluster.get(i) 包含一个集群中的所有元素。 对于报告,我想使用 freemarker 将此结果输出到 .md 文件中 目标是拥有与集群一样多的列,并且在每一行中都有一个相应集群的条目。 这是我的 .ftl 代码:

<#list clusters as c> | Cluster ${c_index} |
<#list c[c_index] as entry> | ${entry.name} | </#list>
</#list>

但是,这会导致以下错误

The value you try to list is an extended_hash+string (package.ClusterEntry wrapped into f.e.b.StringModel), thus you must specify two loop variables after the "as"; one for the key, and another for the value, like <#... as k, v>).

如何正确访问该条目? 如果你已经在这里阅读这篇文章,我怎样才能用这个嵌套循环正确地实现我的列行结构?目前我认为这将是单独的行

【问题讨论】:

    标签: java markdown freemarker


    【解决方案1】:

    而不是&lt;#list c[c_index] as entry&gt; 写&lt;#list c as entry&gt;,因为c 已经拥有来自clusters 的当前列表项。

    要生成一个漂亮的降价表,这相当棘手,因为在开始渲染任何内容之前,您必须知道最长嵌套 List&lt;ClusterEntry&gt; 的长度。此外,如果它必须在源代码级别看起来不错,您还必须计算出每列的最大宽度。在模板中计算这些东西不会很好......也许你应该在 Java 中这样做并将信息传递给数据模型中的模板。

    【讨论】:

    • 首先:谢谢,这对您很有帮助。第二:我已经做了信息计算。我以前用 java 做过这个,意思是写一个 .csv 文件。为此,我计算了最长的行号。那么我该如何搭配这个漂亮的风格呢?并且没有办法使用双重嵌套来填充行和列吗?如果列表中没有条目,我可以将其留空吗?
    • 不确定您到底在哪里遇到了困难,但是要将行填充到所需的长度,您可能需要使用&lt;#list c?chunk(numberOfColumns, '')&gt; 之类的东西(请参阅freemarker.org/docs/…)。
    • 我想我会将此作为一个单独的问题添加,以明确我当前的问题。再次感谢您对第一个问题的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-13
    • 2018-09-12
    相关资源
    最近更新 更多