Вопрос:

Использование java.util.Map в h: dataTable

jsf datatable hashmap treemap

32995 просмотра

3 ответа

1614 Репутация автора

Мне нужно отобразить Mapс помощью <h:dataTable>. У моего боба есть Mapсвойство, как показано ниже:

public class Bean {

    private Map<Integer,String> map; // +getter

    @PostConstruct
    public void init() {
        map = new TreeMap<Integer,String>();
        map.put(1,"Sasi");
        map.put(2,"Pushparaju");
        map.put(3,"Venkat Raman");
        map.put(3,"Prabhakaran");
    }

}

Затем на странице JSF я пытаюсь связать это Mapсвойство с valueатрибутом <h:dataTable>.

 <h:dataTable border="1" value="#{bean.map}" var="map">
    <h:column id="column1">
        <f:facet name="header">
            <h:outputText value="UserId"></h:outputText>
        </f:facet>
        <h:outputText value="#{map.getKey}"></h:outputText>
    </h:column>
    <h:column id="column2">
        <f:facet name="header">
            <h:outputText value="Email Id"></h:outputText>
        </f:facet>
        <h:outputText value="#{map.getValue}"></h:outputText>
    </h:column>
</h:dataTable>

Это дает ошибку, которой getKeyи getValueнет. Я могу понять, что это не правильный способ сделать это. Как я могу представить Mapиспользование <h:dataTable>?

Автор: JPS Источник Размещён: 15.01.2013 05:54

Ответы (3)


29 плюса

897005 Репутация автора

Решение

До предстоящего JSF 2.3, UIDataкомпоненты , такие как <h:dataTable>, <p:dataTable>и т.д. и <ui:repeat>не делает , не поддерживает Перебор Map. Это поддерживается только в <c:forEach>.

Один из способов - преобразовать записи карты в массив (сам по себе entrySet()не будет работать, так как UIDataне поддерживает Setдо следующей версии JSF 2.3).

<h:dataTable value="#{bean.map.entrySet().toArray()}" var="entry">
    <h:column>#{entry.key}</h:column>
    <h:column>#{entry.value}</h:column>
</h:dataTable>

Другой способ заключается в завернуть ввода установки карты в коллекции которой <h:dataTable>можно перебирать, такой как ArrayList.

public class Bean {

    private Map<Integer, String> map;
    private List<Entry<Integer, String>> entries; // +getter (no setter necessary)

    @PostConstruct
    public void init() {
        map = new TreeMap<>();
        map.put(1, "Sasi");
        map.put(2, "Pushparaju");
        map.put(3, "Venkat Raman");
        map.put(4, "Prabhakaran");
        entries = new ArrayList<>(map.entrySet());
    }

    // ...
}
<h:dataTable value="#{bean.entries}" var="entry">
    <h:column>#{entry.key}</h:column>
    <h:column>#{entry.value}</h:column>
</h:dataTable>

Тем не менее, более чистым, самодокументируемым и многократно используемым является использование List<User>вместо этого, в котором Userкласс имеет необходимые свойства idи name.

public class Bean {

    private List<User> users; // +getter (no setter necessary)

    @PostConstruct
    public void init() {
        users = new ArrayList<>();
        users.add(new User(1, "Sasi"));
        users.add(new User(2, "Pushparaju"));
        users.add(new User(3, "Venkat Raman"));
        users.add(new User(4, "Prabhakaran"));
    }

    // ...
}
<h:dataTable value="#{bean.users}" var="user">
    <h:column>#{user.id}</h:column>
    <h:column>#{user.name}</h:column>
</h:dataTable>
Автор: BalusC Размещён: 15.01.2013 06:03

4 плюса

5734 Репутация автора

Вы можете попробовать эту альтернативу тоже.

<h:dataTable border="1" value="#{myBean.map.keySet().toArray()}" var="myVar">
    <h:column id="column1">
        <f:facet name="header">
            <h:outputText value="UserId"></h:outputText>
        </f:facet>
            <h:outputText value="#{myVar}"></h:outputText>
    </h:column>
    <h:column id="column2">
        <f:facet name="header">
            <h:outputText value="Email Id"></h:outputText>
        </f:facet>
            <h:outputText value="#{myBean.map.get(myVar)}"></h:outputText>
    </h:column>
</h:dataTable>
Автор: prageeth Размещён: 16.01.2013 11:56

3 плюса

78 Репутация автора

Что касается последнего ответа от prageeth, вы можете использовать entrySet вместо keySet; тогда вы можете избавиться от myBean.map.get. Смотрите этот пример:

<h:dataTable border="1" value="#{myBean.map.entrySet().toArray()}" var="map">
<h:column id="column1">
    <f:facet name="header">
        <h:outputText value="UserId"></h:outputText>
    </f:facet>
        <h:outputText value="#{map.key}"></h:outputText>
</h:column>
<h:column id="column2">
    <f:facet name="header">
        <h:outputText value="Email Id"></h:outputText>
    </f:facet>
        <h:outputText value="#{map.value}"></h:outputText>
</h:column>
</h:dataTable>

Это работает на моих лицах 2.2.3, поскольку я только использовал это непосредственно.

Аннотация: Я бы лучше прокомментировал последний пост, но моя репутация недостаточно высока, поэтому это дополнительный ответ.

Автор: Jörg Henke Размещён: 17.06.2014 04:13
Вопросы из категории :
32x32