Java 避免在使用freeMarker模板创建的html表中重复数据
我正在使用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
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)
。