在Primefaces 5.1 (Tomcat 8和Servlet 3.0)中,您可以使用DataGrid, DataList, DataTable等来迭代List<Objects>
。例如:
<p:dataTable var="car" value="#{dtBasicView.cars}">
<p:column headerText="Id">
<h:outputText value="#{car.id}" />
</p:column>
</p:dataTable>
控制器:
@ManagedBean(name="dtBasicView")
@ViewScoped
public class BasicView implements Serializable {
private List<Car> cars;
@ManagedProperty("#{carService}")
private CarService service;
@PostConstruct
public void init() {
cars = service.createCars(10);
}
public List<Car> getCars() {
return cars;
}
public void setService(CarService service) {
this.service = service;
}
}
但是假设Car
对象有一个类似washes
的属性所以当我这样做时:
<h:outputText value="#{car.washes}" />
在dataTable内部,它返回List<Washes>
的列表。我不能选择索引,所以我如何迭代虽然List<Washes>
内的数据表?
我知道我可以在数据表中创建一个dataGrid,然后像在cars中一样迭代遍历洗涤列表。但是这会创建一个新的"HTML表格,其中一个单元格内有边框"。我如何才能迭代列表并从洗涤输出字符串:#{washes.foo}
更新:当尝试使用<ui:repeat>
作为答案时,我得到这个错误:
Property 'foo' not found on type org.hibernate.collection.internal.PersistentSet
当我使用<p:dataGrid>
而不是<ui:repeat>
时,它可以工作。
另外,我返回的是一个集合而不是一个列表,所以我必须使用toArray()
您可以嵌套另一个迭代组件,就像在普通Java中嵌套for
循环一样。
<p:dataTable>
的例子,假设Wash
有一个属性foo
:
<p:dataTable value="#{bean.cars}" var="car">
<p:column headerText="Washes">
<p:dataTable value="#{car.washes}" var="wash">
<p:column headerText="Foo">#{wash.foo}</p:column>
</p:dataTable>
</p:column>
</p:dataTable>
使用<ui:repeat>
或<h:dataTable>
,如果你想要无标记/无样式的迭代:
<p:dataTable value="#{bean.cars}" var="car">
<p:column headerText="Washes">
<ui:repeat value="#{car.washes}" var="wash">
#{wash.foo}
</ui:repeat>
</p:column>
</p:dataTable>
顺便说一下,使用复数作为类名很奇怪,而你可以在List
中有多个。您可能希望将Washes
重命名为Wash
。上面的代码片段已经考虑到了这一点。通过这种方式,您可以看到代码变得更加具有自文档性。
根据错误更新;<ui:repeat>
和<h:dataTable>
组件不支持在Set<E>
上迭代。该支持将在未来的JSF 2.3版本中提供。如果不能将Set<E>
替换为List<E>
,则只需从其中获取一个数组,如下所示:
<ui:repeat value="#{car.washes.toArray()}" ...>