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

时间:2014-08-06 10:14:02

标签: java html freemarker

我正在使用FreeMarker模板生成一个html表。数据来自List<List<Object>>POJO的服务器。

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

<#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>

但是,这会产生如下输出 -

The output with current code

但是,我想要输出如下(避免冗余数据)

Expected

(通过硬编码html生成。)

如何处理输入以生成此类输出。

我面临的问题是 -

1)截至目前尚未对数据进行排序

2)我不知道重复值的列数

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

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

由于

1 个答案:

答案 0 :(得分:2)

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

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

但是你肯定不想用这样的View细节来污染模型。因此,您可以为要执行此操作的每列维护一个FTL变量,我们称之为cellHeightLeft。其初始值应为0。在打印td时,请检查其值。如果是0,那么您可以使用索引访问(allRows[someIndex][someCol])来计算此跨度的长度,将其存储在cellHeightLeft中,打印td rowspan属性值,然后降低cellHeightLeft。如果它不为0,则跳过td,然后减少cellHeightLeft。这就是基本算法。你可能需要一些#function - s来做这件事。