用户界面-迭代嵌套的对象列表



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

相关内容

  • 没有找到相关文章

最新更新