Итерация по HashMap.values ​​() в JSF + Facelets - PullRequest
5 голосов
/ 22 ноября 2008

Я использую JSF / Facelets и пытаюсь перебрать некоторые объекты Document (пользовательский объект), которые я храню в HashMap. Когда страница загружена, я получаю сообщение об ошибке «Свойство name не найдено по типу java.util.HashMap $ Values». Вот что у меня в зерне:

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;
}

Разве я не могу перебирать Коллекцию?

1 Ответ

9 голосов
/ 22 ноября 2008

Ну, как оказалось, вы не можете просто использовать любой тип коллекции с dataTable, и для этого есть веская причина. Из спецификации MyFaces 1.2 атрибут value должен быть:

EL выражение, которое определяет модель данных, которая поддерживает эту таблицу.

Значение, на которое ссылается EL Выражение может быть любого типа.

  • Значение типа DataModel используется напрямую.
  • Подобные массиву параметры типа Object[], java.util.List, java.sql.ResultSet или javax.servlet.jsp.jstl.sql.Result заключены в соответствующий DataModel, который знает, как перебирать элементы.
  • Другие значения заключены в DataModel в одну строку.

Обратите внимание, в частности, что неупорядоченные коллекции, например, Set, не поддерживаются. Поэтому, если выражение значения ссылается на такой объект, считается, что таблица содержит только один элемент - саму коллекцию.

Коллекция, возвращаемая из HashSet.values ​​(), не упорядочена и, следовательно, не поддерживается. Если бы это было так, вы бы не знали, в каком порядке будут выводиться строки в вашей таблице, и при обновлении страницы их можно было бы изменить в случайном порядке. Не хорошо.

Ошибка, которую вы получаете, в последнем абзаце говорит, что datatable рассматривает вашу Collection как строковый объект, а Collection не имеет свойства name.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...