Как отобразить список hashmaps в пользовательском интерфейсе: repeat? - PullRequest
5 голосов
/ 03 декабря 2011

У меня проблема с использованием JSF для отображения некоторых данных в Facelets. У меня есть список хэш-карт:

List<Map<String, String>> persons = new LinkedList<Map<String,String>>();

public List getPersons() {
    return this.persons;
}

Я получаю это из базы данных следующим образом:

while(rs.next()) {
  Map<String,String> result = new HashMap<String,String>();
  result.put("name", rs.getString(1));
  result.put("category", rs.getString(2));
  this.persons.add(result);
}

Итак, моя проблема в том, как отобразить информацию для каждой карты в формате xhtml. Я пытаюсь использовать ui:repeat, но это неправильно, поэтому мне нужна помощь. У меня должен быть получатель имени и семьи, но как мне его добавить?

<ui:repeat value="#{class.persons}" var="persons">   
  <h:outputText value="#{persons['name'}"/>
  <h:outputText value="#{persons['family'}"/>                       
</ui:repeat>

Надеюсь, вы понимаете мою проблему и поможете мне ее исправить. Заранее спасибо!

1 Ответ

3 голосов
/ 03 декабря 2011

Таким образом, #{persons} является Map<String, String>. Вы можете получить доступ к значениям карты по ключам так же, как обычные Javabeans. Так что #{person.name} вернет map.get("name").

Итак, это должно сделать:

<ui:repeat value="#{class.persons}" var="person">   
  <h:outputText value="#{person.name}"/>
  <h:outputText value="#{person.family}"/>
</ui:repeat>

(я переименовал только persons в person, потому что он, по сути, представляет только одного человека)

Между прочим, также допустим следующий способ, и он фактически будет единственным, если у вас есть ключ карты, содержащий точки:

<ui:repeat value="#{class.persons}" var="persons">   
  <h:outputText value="#{persons['name']}"/>
  <h:outputText value="#{persons['family']}"/>                       
</ui:repeat>

(видите, вы были близки, вы только забыли закрывающую скобку)

Однако обычная практика заключается в создании класса Javabean вместо Map, если он действительно представляет сущность.

public class Person {

    private String name;
    private String family;
    // ...

    // Add/generate getters/setters and other boilerplate.
}

И скормить его как List<Person> к виду.

...