Je dois afficher Map
en utilisant <h:dataTable>
. Mon bean de sauvegarde a une propriété Map
comme ci-dessous:
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");
}
}
Ensuite, dans la page JSF, j'essaie de lier cette propriété Map
à l'attribut value
de <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>
Cela donne en erreur que getKey
et getValue
n'est pas présent. Je peux comprendre que ce n'est pas la bonne façon de procéder. Comment puis-je présenter un Map
en utilisant <h:dataTable>
?
Jusqu'à la prochaine version de JSF 2.3, UIData
composants tels que <h:dataTable>
, <p:dataTable>
, Etc et <ui:repeat>
Ne pas supporte l'itération sur un Map
. Ceci n'est pris en charge que dans <c:forEach>
.
Une façon consiste à convertir les entrées de la carte en un tableau (seul entrySet()
ne fonctionnera pas comme UIData
ne prend pas en charge Set
jusqu'à la prochaine version 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>
Une autre façon consiste à envelopper l'ensemble d'entrées de la carte dans une collection sur laquelle le <h:dataTable>
Peut itérer, comme un 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>
Cependant, plus propre, auto-documenté et réutilisable consiste à utiliser un List<User>
À la place dans lequel la classe User
a les propriétés nécessaires id
et 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>
Vous pouvez également essayer cette alternative.
<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>
En ce qui concerne la dernière réponse de prageeth, vous pouvez utiliser entrySet au lieu de keySet; alors vous pouvez vous débarrasser de myBean.map.get. Voir cet exemple:
<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>
Cela fonctionne sur myfaces 2.2.3 car je viens de l'utiliser moi-même.
Annotation: je ferais mieux d'avoir commenté le dernier post, mais ma réputation n'est pas assez élevée, c'est donc une réponse supplémentaire.