【发布时间】:2013-12-02 09:52:02
【问题描述】:
我们有一个 JSF 页面,其中显示了一个带有查询结果的表格。我们只想显示前 3 个结果。
如何使用<ui:repeat> 来做到这一点?
我们不能在业务层这样做,因为它不在我们的控制之下。我们需要在视图侧将结果限制为 3。
【问题讨论】:
-
我很困惑。你是使用
ui:repeat还是h:dataTable作为输出?
我们有一个 JSF 页面,其中显示了一个带有查询结果的表格。我们只想显示前 3 个结果。
如何使用<ui:repeat> 来做到这一点?
我们不能在业务层这样做,因为它不在我们的控制之下。我们需要在视图侧将结果限制为 3。
【问题讨论】:
ui:repeat 还是h:dataTable 作为输出?
您可以按照 kocko 在他的回答中提出的方式进行操作,但是遍历整个列表以仅输出三个组件肯定是相当过分的。
这种详细方法的必要性是因为<ui:repeat> 组件的size 属性由于某种原因不允许指定EL 作为其值,而是像3 这样的普通整数。另见Jsf ui:repeat size doesn't gets java bean value。
如果您知道只需要 3 个值,则可以使用 size 属性:
<ui:repeat var="var" value="#{bean.list}" size="3">
<h:outputText value="#{var}" />
</ui:repeat>
或者,如果您在 EL2.2+ 上,您可以通过调用 List#subList(from, to) 方法获取子列表:
<ui:repeat var="var" value="#{bean.list.subList(0, (bean.list.size() gt 3) ? 3 : bean.list.size())}">
<h:outputText value="#{var}" />
</ui:repeat>
【讨论】:
size 选项,但如果列表包含少于 3 个元素,则会产生错误。
您可以执行以下操作:
<ui:param>,它将保存显示结果的限制。在您的情况下,它将是 3。<ui:repeat> 的varStatus 属性,它的内部index 属性保存当前集合项的索引。例如:
<ui:param name="limit" value="3"/>
<ui:repeat var="item" value="#{managedBean.list}" varStatus="status">
<ui:fragment rendered="#{status.index lt limit}">
<! -- place your value-holding-component here -->
</ui:fragment>
</ui:repeat>
这样您将只有 3 个由 <ui:repeat> 呈现的组件。
注意 rendered 属性被引入到 JSF 2.1 中的 <ui:fragment>。如果您的 JSF 版本早于 2.1,请考虑将 <ui:fragment> 更改为
<h:panelGroup rendered="#{status.index lt limit}">
<! -- place your value-holding-component here -->
</h:panelGroup>
【讨论】: