JSF - 如何正确使用循环[c:forEach vs ui:repeat]

时间:2016-08-19 13:57:24

标签: jsf-2

我正在尝试创建一个通用的可分页表,它将显示数据库中的任何实体。我正在为此目的使用注释和反射。在Java方面一切正常,但我无法设置为我的表创建一个视图。我尝试了两种方法,使用c:forEach和ui:repeat:

视图要求

  • 应在每页上显示固定数量的记录(例如10)
  • 应根据查看的字段类型(在hibernate实体中注释的字段)自动生成用于浏览和编辑表列的组件
  • 应添加带有操作的附加列(删除,保存,过滤,添加实体)
  • 应在表格标题
  • 上方添加用于过滤和添加新实体的附加行
  • 每列必须是可排序的

c:forEach approach problem

在具有不同记录数的页面之间切换时,会显示正确的记录,但行数与上一页相同。如果上一页的记录少于下一页的记录,那么上一页的记录多于下一页的记录将超过应有的记录。但是,当我刷新给定页面上的整个网站时,所有内容都会正确呈现。

When changing from page with more records to page with less

When changing from page with less records to page with more

在第一张图片上,您可以看到,当我转到最后一页时,会生成不必要的记录以匹配之前的页面大小。在第二张图片上,页面大小被截断为最后一页的大小。

表正文代码

<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似乎对我来说效果更好,至少表可用。你能告诉我如何解决这个问题吗?

谢谢,

0 个答案:

没有答案