在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>
的列表。我无法选择索引,那么如何迭代dataTable中的List<Washes>
?
我知道我可以在数据表中创建一个dataGrid,然后像汽车一样迭代一下Washes列表。但是这会创建一个新的“HTML表格,其中一个单元格内有一个边框”。我怎样才能迭代列表并从washes输出字符串:#{washes.foo}
更新:根据答案尝试使用<ui:repeat>
时出现此错误:
Property 'foo' not found on type org.hibernate.collection.internal.PersistentSet
当我使用<p:dataGrid>
代替<ui:repeat>
时,它可以正常工作。
另外,我正在返回一个集而不是列表,所以我不得不使用toArray()
答案 0 :(得分:1)
您可以嵌套另一个迭代组件,就像在普通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()}" ...>