5

我正在使用 JSF/Facelets,我正在尝试迭代一些我保存在 HashMap 中的 Document 对象(自定义对象)。加载页面时,我收到错误“在 java.util.HashMap$Values 类型上找不到属性‘名称’”。这是我的支持 bean 中的内容:

private Map<String, Document> documents = new HashMap<String, Document>();

public Collection<Document> getDocuments(){
    return documents.values();
}

在我的 xhtml 页面中:

<h:dataTable id="documentTable"
    value="#{DocumentManager.allDocuments}"
    var="doc" rowClasses="list-row-odd, list-row-even"
    headerClass="table-header" styleClass="bordered">

    <h:column id="col_name">
         <f:facet name="header">Name</f:facet>
         ${doc.name}
    </h:column>
</h:dataTable>

如果我将 getDocuments 函数更改为以下内容,它可以工作(意味着表格显示没有错误),但我不确定为什么需要将值放在 JSF/Facelets 页面的列表中才能正确显示。

public List<Document> getDocuments(){
    List<Document> rtrn = new ArrayList<Document>();
    for(Document doc : documents.values())
        rtrn.add(doc);
    return rtrn;
}

我不应该能够迭代集合吗?

4

1 回答 1

9

好吧,事实证明,您不能只对 dataTable 使用任何类型的集合类型,这是有充分理由的。从MyFaces 1.2 Spec中, value 属性必须是:

一个 EL 表达式,它指定支持此表的数据模型。

EL 表达式引用的值可以是任何类型。

  • 直接使用 DataModel 类型的值。
  • Object[]类型为 ,或的类数组参数包装在相应的 DataModel 中java.util.List,该 DataModel 知道如何迭代元素。java.sql.ResultSetjavax.servlet.jsp.jstl.sql.Result
  • 其他值作为单行包装在 DataModel 中。

请特别注意,Set不支持无序集合,例如。因此,如果值表达式引用了这样一个对象,那么该表将被认为只包含一个元素 - 集合本身。

从 HashSet.values() 返回的 Collection 没有排序,因此不受支持。如果是这样,您将不知道表中的行将以什么顺序输出,并且页面的刷新可能会随机重新排序它们。不好。

您得到的错误是,从最后一段开始,它说数据表将您的 Collection 视为行对象,而 Collection 没有“名称”属性。

于 2008-11-21T23:09:20.500 回答