我正在尝试创建一个通用的可分页表,它将显示数据库中的任何实体。我正在为此目的使用注释和反射。在Java方面一切正常,但我无法设置为我的表创建一个视图。我尝试了两种方法,使用c:forEach和ui:repeat:
视图要求:
c:forEach approach problem :
在具有不同记录数的页面之间切换时,会显示正确的记录,但行数与上一页相同。如果上一页的记录少于下一页的记录,那么上一页的记录多于下一页的记录将超过应有的记录。但是,当我刷新给定页面上的整个网站时,所有内容都会正确呈现。
在第一张图片上,您可以看到,当我转到最后一页时,会生成不必要的记录以匹配之前的页面大小。在第二张图片上,页面大小被截断为最后一页的大小。
表正文代码:
<tbody class="lot">
<c:forEach items="#{cc.attrs.wflBean.searchProvider.cells}" var="row" varStatus="rowStatus">
<tr>
<c:forEach items="#{row.cells}" var="cell" varStatus="cellStatus">
<td style="text-align: #{cell.alignment}; vertical-align: bottom;">
<h:commandLink action="#{cc.attrs.wflBean.editEntity}" value="Edit" styleClass="none"
rendered="#{cc.attrs.wflBean.isExternalEditSupported and cc.attrs.wflBean.canEdit}">
<f:setPropertyActionListener target="#{cc.attrs.wflBean.currentEntity}" value="#{cell.entity}"/>
</h:commandLink>
<!--TODO: cellIndex will not work properly for more then 10 columns/rows-->
<comp:pagableTableCell wflBean="#{cc.attrs.wflBean}" cell="#{cell}"
cellIndex="#{cellStatus.index}#{rowStatus.index}"
canEdit="#{not cc.attrs.wflBean.isExternalEditSupported and cc.attrs.wflBean.canEdit}"/>
</td>
</c:forEach>
...CODE FOR ADDING ADDITIONAL ACCTIONS...
</c:forEach>
</tbody>
pagableTableCell是一个自定义组件,它使用 c呈现正确的组件来编辑单元格值:选择 / c:当 / c:否则标签。更改页面时,将检索单元格。它在 RESTORE_VIEW 和 RENDER_RESPONSE 阶段完成。在 RENDER_RESPONSE 阶段,新页面的单元格重新计算并正确返回。另外,我读到在构建视图阶段评估了 c:forEach 标记,但是我没有看到 javax.faces.event.PhaseId 是什么?页面由另一个自定义组件设置,并且在 RENDER_RESPONSE 阶段之前正确完成。
ui:重复处理问题:
通过这种方法,我将 c:forEach 替换为 ui:repeat 和 c:选择 / c:when / c:否则与 ui:fragment 然后,我无法在id属性中评估EL表达式,使其唯一,对于您可以看到的日期组件上面的图像。日期组件需要唯一ID才能正常工作。使用 ui:repeat 时,有没有办法手动生成组件ID?
总的来说,我不知道该如何解决这个问题。 c:forEach似乎对我来说效果更好,至少表可用。你能告诉我如何解决这个问题吗?
谢谢,