Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在JSF+;小脸_Java_Jsf_Datatable - Fatal编程技术网

Java 在JSF+;小脸

Java 在JSF+;小脸,java,jsf,datatable,Java,Jsf,Datatable,我使用的是JSF/Facelets,我试图迭代保存在HashMap中的一些文档对象(自定义对象)。加载页面时,我得到错误“在java.util.HashMap$Values类型上找不到属性'name'。以下是我的支持bean中的内容: private Map<String, Document> documents = new HashMap<String, Document>(); public Collection<Document> getDocumen

我使用的是JSF/Facelets,我试图迭代保存在HashMap中的一些文档对象(自定义对象)。加载页面时,我得到错误“在java.util.HashMap$Values类型上找不到属性'name'。以下是我的支持bean中的内容:

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

public Collection<Document> getDocuments(){
    return documents.values();
}
private Map documents=new HashMap();
公共收集文件(){
返回文档。值();
}
在我的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>

名称
${doc.name}
如果我将getDocuments函数更改为以下内容,它就可以正常工作(意味着表的显示不会出错),但我不确定为什么需要将值放入列表中,以便JSF/Facelets页面正确显示

public List<Document> getDocuments(){
    List<Document> rtrn = new ArrayList<Document>();
    for(Document doc : documents.values())
        rtrn.add(doc);
    return rtrn;
}
公共列表getDocuments(){ List rtrn=new ArrayList(); 对于(文档文档:documents.values()) rtrn.add(doc); 返回rtrn; }
难道我不应该遍历集合吗?

事实证明,不能对dataTable使用任何类型的集合类型,这是有充分理由的。从中,值属性必须为:

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

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

  • 直接使用DataModel类型的值
  • Object[]
    java.util.List
    java.sql.ResultSet
    javax.servlet.jsp.jstl.sql.Result
    类型的类似数组的参数封装在相应的DataModel中,该DataModel知道如何迭代元素
  • 其他值作为单行包装在数据模型中
请特别注意,不支持无序集合,例如
Set
。因此,如果值表达式引用这样一个对象,那么表将被视为只包含一个元素——集合本身

从HashSet.values()返回的集合没有排序,因此不受支持。如果是这样,您就不知道表中的行的输出顺序,页面刷新可能会随机地对它们重新排序。不太好


您得到的错误是,从上一段开始,它说datatable将您的集合视为行对象,并且集合没有“name”属性。

另外,我认为您可以调用:return new ArrayList(document.values())