JSF 1.2 - Iteration über eine Karte, die enthält Sammlungen
Verwendung von JSF 1.2 und JSP....
Ist es möglich, zum Durchlaufen einer Karte, deren Werte enthalten die Sammlungen?
Ich habe eine Karte, die so aussieht:
Map<String, List<Foo>> myMap;
Möchte ich Durchlaufen myMap und zeichnen Sie eine separate Tabelle für jeden Schlüssel.
Jede Tabelle wird contaim mehrere Zeilen.
Jede Zeile repräsentiert ein Foo-Objekt aus der ArrayList zugeordnet, um die aktuellen Schlüssel.
Leider sind wir mit JSF 1.2 und JSP.
Ich hatte gehofft, ich könnte die Verwendung einer geschachtelten <h:dataTable>
tag, aber ich bin nicht mit irgendeinem Erfolg.
Bearbeiten:
Hier ist meine aktuelle JSP-code nach Anhörung BalusC Antwort:
<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>
Es bewirkt, dass die folgende Ausnahme:
javax.servlet.jsp.JspTagException: Don't know how to iterate over supplied "items" in <forEach>
Hier ist etwas code aus meinem Managed Bean.
Hinweis, dass ich mit HashMap und ArrayList anstatt die Karte und die Liste
(Ich habe irgendwo gelesen, Sie konnte es nicht verwenden-Schnittstellen, die auch nicht funktionieren)
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());
}
Aufrufen dumpMapInfo
vor dem Rendern der Seite wird bestätigt, dass die Karte nicht null und wird aufgefüllt, als erwartet.
- Sorry, verpasste der JSF 1.2 Teil. Dies könnte hilfreich sein: stackoverflow.com/a/8552872/880619
- Leider sind wir mit JSP (nicht Facelets).
Du musst angemeldet sein, um einen Kommentar abzugeben.
JSF hat keine Komponente, die zum iterieren über ein
Map
. Nur die JSTL<c:forEach>
iterieren über eineMap
. Jede iteration gibt Ihnen eineGekennzeichnet.Eintrag
zurück, die wiederumgetKey()
undgetValue()
Methoden. Können Sie wiederum verwenden eine<h:dataTable - >
zum Durchlaufen der map-Wert.Update dies funktioniert nur, wenn Sie mit JSTL 1.2. Dies scheitert in der JSTL 1.1, weil
#{}
wird nicht erkannt im JSTL 1.1-tags und damit Sie gezwungen sind, verwenden Sie${}
, aber dies wiederum scheitert in der verschachtelten JSF-Komponenten, weil Sie annehmen#{}
nur. Sie hatte im Grunde müssen die fall-back "plain" JSP/HTML-in das gesamte Stück code, oder, noch besser, schnappen Sie sich Tomahawk ist<t:dataList>
.javax.servlet.jsp.JspTagException: Don't know how to iterate over supplied "items" in <forEach>
Beachten Sie, dass wir mit JSF 1.2 und mit Sun Application Server 9.0_1web.xml
set zu Servlet 2.5). Was JSTL-und container-version genau benutzt du?<c:forEach items="bean.map">
ohne die#{}
oder${}
.System.out.println(ForEachTag.class.getPackage().getImplementationVersion());
.$
von der backing-bean-name und verwenden Sie${}
notation "die üblichen JSP-Weg". Es will einfach nicht mischen mit$
in der bean-name und mit#{}
in verschachtelten JSF-Komponenten.<t:dataList>
(und die<t:saveState>
awesomeness, die simuliert JSF2 view-Bereich).<t:dataList>
funktioniert nicht auf einer Karte.