JSF 1.2 - Iterieren Sie über eine Map, die Sammlungen enthält

JSF verwenden1.2 undJSP....

Ist es möglich, über eine Karte zu iterieren, deren Werte Sammlungen enthalten?

Ich habe eine Karte, die so aussieht:

Map<String, List<Foo>> myMap;

Ich möchte über myMap iterieren und für jeden Schlüssel eine eigene Tabelle zeichnen.

Jede Tabelle enthält mehrere Zeilen.

Jede Zeile repräsentiert ein Foo-Objekt aus der ArrayList, das dem aktuellen Schlüssel zugeordnet ist.

Leider verwenden wir JSF 1.2 und JSP.

Ich hatte gehofft, ich könnte ein verschachteltes verwenden<h:dataTable> tag, aber ich habe keinen erfolg.

Bearbeiten:

Hier ist mein aktueller JSP-Code, nachdem ich die Antwort von BalusC gelesen habe:

                    <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 verursacht die folgende Ausnahme:

javax.servlet.jsp.JspTagException: Don't know how to iterate over supplied "items" in <forEach>

Hier ist ein Code aus meiner Managed Bean.

Beachten Sie, dass ich HashMap und ArrayList anstelle von Map und List verwende

(Ich habe irgendwo gelesen, dass man keine Schnittstellen benutzen kann, 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());
}

BerufungdumpMapInfo Vor dem Rendern der Seite wird bestätigt, dass die Karte nicht null ist und wie erwartet ausgefüllt ist.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage