JSF 1.2 - itérer sur une Carte qui contient des Collections
Utilisant JSF 1.2 et JSP....
Est-il possible d'itérer sur une Carte dont les valeurs contiennent des Collections?
J'ai une Carte qui ressemble à ceci:
Map<String, List<Foo>> myMap;
Je voudrais effectuer une itération sur myMap et dessiner un tableau distinct pour chaque clé.
Chaque table contaim plusieurs lignes.
Chaque ligne représentera un objet Foo à partir de la liste de tableaux mappé à la clé en cours.
Malheureusement, nous sommes en utilisant JSF 1.2 et JSP.
J'espérais que je pourrais utiliser un imbriquée <h:dataTable>
tag, mais je ne suis pas avoir une chance de réussir.
Modifier:
Voici mon code JSP, après consultation BalusC réponse:
<c:forEach items="#{someModule$someBean.prefMap}" var="mapEntry">
<br/><br/><p>Key: <h:outputText value="#{mapEntry.key}"/></p>
<h:dataTable value="#{mapEntry.value}" var="pref">
<h:column><h:outputText value="#{pref.defaultFieldLabel}"/></h:column>
<h:column><h:outputText value="#{pref.fieldLabel}"/></h:column>
</h:dataTable>
</c:forEach>
Il provoque l'exception suivante:
javax.servlet.jsp.JspTagException: Don't know how to iterate over supplied "items" in <forEach>
Voici le code de mon Managed Bean.
Remarque que je suis en utilisant HashMap et liste de tableaux au lieu de la Carte et la Liste
(J'ai lu quelque part, vous ne pouviez pas utiliser les interfaces, ce qui ne fonctionne pas)
private HashMap<String, ArrayList<Foo>> prefMap;
public HashMap<String, ArrayList<Foo>> getPrefMap()
{
if (prefMap == null)
{
buildPrefMap();
}
return prefMap;
}
private void buildPrefMap()
{
prefMap = new HashMap<String, ArrayList<Foo>>();
for (Foo mdp : getFooArray())
{
String cat = mdp.getField().getCategory();
if (! prefMap.containsKey(cat))
{
ArrayList<Foo> mpl = new ArrayList<Foo>();
mpl.add(mdp);
prefMap.put(cat, mpl);
}
else
{
prefMap.get(cat).add(mdp);
}
}
}
private void dumpMapInfo()
{
StringBuilder sb = new StringBuilder();
Map<String, ArrayList<Foo>> theMap = getPrefMap();
for (String key : theMap.keySet())
{
sb.append(key + ": " + theMap.get(key).size());
}
System.out.println("\n\n" + sb.toString());
}
Appel dumpMapInfo
avant le rendu de la page confirme que la Carte n'est pas nulle et est définie comme prévu.
Malheureusement, nous sommes à l'aide de JSP (pas Facelets).
OriginalL'auteur jahroy | 2012-10-02
Vous devez vous connecter pour publier un commentaire.
JSF n'ont pas de composant qui peut effectuer une itération sur un
Map
. Seul le JSTL<c:forEach>
pouvez effectuer une itération sur unMap
. Chaque itération vous donne unCarte.Entrée
dos, qui à son tour agetKey()
etgetValue()
méthodes. Vous pouvez utiliser un<h:dataTable>
pour effectuer une itération sur la valeur de la carte.Mise à jour cela ne fonctionne que lorsque vous êtes à l'aide de JSTL 1.2. Cette échoue dans JSTL 1.1 car
#{}
n'est pas reconnu dans JSTL 1.1 balises et donc vous êtes obligés d'utiliser${}
, mais cela à son tour échoue dans le imbriqués composants JSF parce qu'ils acceptent#{}
seulement. Vous serait essentiellement le besoin de revenir à "la plaine" JSP/HTML dans l'ensemble de ce morceau de code, ou, mieux, prenez Tomahawk est<t:dataList>
.javax.servlet.jsp.JspTagException: Don't know how to iterate over supplied "items" in <forEach>
Noter que nous sommes en utilisant JSF 1.2 et sont à l'aide de Sun Application Server 9.0_1Fonctionne très bien pour moi avec JSTL 1.2 et Tomcat 6.0.35 (avec
web.xml
ensemble de Servlet 2.5). Ce JSTL et les conteneurs version exactement?SJAS 9.0 utilise JSTL 1.1, mais il devrait fonctionner aussi bien. Êtes-vous certain que le EL syntaxe est correcte? Vous pourriez obtenir cette erreur sur, par exemple,
<c:forEach items="bean.map">
sans#{}
ou${}
.Comment puis-je vérifier ce qui JSTL version que nous utilisons? Je crois que nous sommes à l'aide de Servlet 2.5 (web.xml dit versoin="2.5").
System.out.println(ForEachTag.class.getPackage().getImplementationVersion());
.OriginalL'auteur BalusC