Java 避免在使用freeMarker模板创建的html表中重复数据

Java 避免在使用freeMarker模板创建的html表中重复数据,java,html,freemarker,Java,Html,Freemarker,我正在使用FreeMarker模板生成一个html表。数据以POJO中的List的形式来自服务器 我正在使用以下代码创建表(截至目前) ${cellEntry} 没有发现任何记录 但是,这会产生如下输出- 但是,我希望输出如下(以避免冗余数据) (通过硬编码html生成。) 如何处理输入以生成这样的输出 我面临的问题是- 1) 数据目前尚未排序 <#if report.getFormattedRecord()?has_content> <#assign allR

我正在使用FreeMarker模板生成一个html表。数据以
POJO
中的
List
的形式来自服务器

我正在使用以下代码创建表(截至目前)


${cellEntry}
没有发现任何记录
但是,这会产生如下输出-

但是,我希望输出如下(以避免冗余数据)

(通过硬编码html生成。)

如何处理输入以生成这样的输出

我面临的问题是-

1) 数据目前尚未排序

<#if report.getFormattedRecord()?has_content>
    <#assign allRows = report.getFormattedRecord()>
</#if>

<table>
    <#if allRows ??>
        <#list allRows as rowEntry>
            <tr>
                <#list rowEntry as cellEntry>
                        <#if cellEntry ??>
                            <td nowrap style="font-family:Arial;font-size:10" align=${columnStyle(columnType[cellEntry_index])}>${cellEntry}</td>
                        <#else>
                            <td> </td>
                        </#if>
                </#list>
            </tr>
        </#list>                    
    <#else>
        <tr>
            <td>No records found</td>
        </tr>
    </#if>          
</table>
2) 我不知道重复值的列数

3) 解析数据返回以使用freemarker模板创建此类HTML

是否有更好的设计可以避免冗余


谢谢

通常不应在FTL中进行排序,而应在模型中包含已排序的数据。这部分只是MVC的良好实践

关于td rowspan-s,为了便于讨论,首先让我们假设您在模型中解决它(使用FreeMarker术语的“数据模型”)。然后,您只需要为每个单元格提供一个
cellHeight
属性:它告诉您
rowspan
属性值,或者如果它是
0
,这意味着您应该跳过显示该单元格


但您肯定不想用这样的视图细节污染模型。因此,您可以为要进行此跨越的每个列维护一个FTL变量,我们称之为
cellHeightLeft
。其初始值应为
0
。在打印
td
时,请检查其值。如果是
0
,则使用索引访问(
allRows[someIndex][someCol]
)进行前瞻性计算,以计算此跨度的长度,将其存储在
cellHeightLeft
中,使用
rowspan
属性值打印
td
,然后减小
cellHeightLeft
。如果它不是0,则跳过
td
,并减小
单元格左高
。这就是基本算法。您可能需要一些
#函数
-s之类的函数才能很好地完成这项工作。

首先,我们可以假设
数据在所有3列中进行排序
,这3列都有重复的条目。但是,2和3对于meCan来说是强制性的,这可以通过更改从服务器接收的数据的格式来实现吗?我认为,
Map
可以使用。这会使我的任务更容易,但我没有得到地图的格式,然后在freemarker(ftl)中解析地图会更容易。我理解算法,所以接受了它。但是停留在
上,您可以为每列维护一个FTL变量
:(如何做到这一点?使用这种方法,对于像
A B1 C
A B2 C
这样的数据,C将被分组,这看起来有点糟糕,我需要一些东西,比如如果上一列没有分组,不要将其以及所有子列分组。如果您事先知道将有哪些列,每个列都可以有自己的专用变量。如果您想对于一些更一般的情况,我建议调用java <代码> TeMtPeMeMoDeMeXEX/Cuff>,将模型转化为一个比特…FTL并不意味着要用于实现复杂的算法。搜索列。忘记提到…
TemplateMethodModelEx
-es可以像
一样从FTL实例化,然后调用它来完成繁重的工作,比如
myHelper(params)