迭代嵌套的对象列表

时间:2015-07-10 13:23:22

标签: user-interface jsf

在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()

1 个答案:

答案 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()}" ...>