我们有一个JSF页面,它显示了一个包含查询结果的表。我们只想显示前三名的结果。
使用<ui:repeat>
如何做到这一点?
我们不能在业务层这样做,因为它不在我们的控制之下。我们需要将结果限制为3。
您可以按照kocko在他的回答中提出的方式进行操作,但在整个列表中迭代只输出三个组件肯定是太过分了。
由于某种原因,<ui:repeat>
组件的size
属性不允许将EL指定为其值,而是像3
一样指定为普通整数,这决定了这种详细方法的必要性。另请参阅Jsf-ui:repeat-size dons';t获取javabean值。
如果您知道只需要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>
您可以执行以下操作:
- 注册一个
<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>
这样,<ui:repeat>
将只渲染3个组件。
注意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>