我正在使用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>
但是,这会产生如下输出 -
但是,我想要输出如下(避免冗余数据)
(通过硬编码html生成。)
如何处理输入以生成此类输出。
我面临的问题是 -
1)截至目前尚未对数据进行排序
2)我不知道重复值的列数
3)解析数据返回以使用freemarker模板创建此类
是否有更好的设计可以避免冗余?
由于
答案 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来做这件事。