3 Stimmen

Probleme bei der Iteration über eine HashMap mit JSF, MyFaces & Facelets

Ich habe einige Probleme Schleife über eine HashMap zu drucken, es ist Werte auf dem Bildschirm. Könnte jemand meinen Code doppelt überprüfen, um zu sehen, was ich falsch mache. Ich kann nicht scheinen, etwas falsch zu finden, aber es muss etwas sein.

In einem Servlet füge ich der Anfrage Folgendes hinzu:

Map<String, String> facetValues = new HashMap<String, String>();
// Filling the map
req.setAttribute(facetField.getName(), facetValues);

In einem Fall ergibt "facetField.getName()" den Wert "discipline". Auf meiner Seite habe ich also Folgendes:

<ui:repeat value="${requestScope.discipline}" var="item">
  <li>Item: <c:out value="${item}"/>, Key: <c:out value="${item.key}"/>, Value: <c:out value="${item.item}"/></li>
</ui:repeat>

Die Schleife wird einmal durchlaufen, aber alle Ausgaben sind leer?!? Ich hätte zumindest einen Eintrag erwartet, wenn die Schleife einmal durchgelaufen ist. Wenn ich das Debug-Popup für Facelets überprüfe, ist die Disziplin da und in der Schleife. Die Ausgabe auf dem Bildschirm ergibt etwas, das für mich wie eine Karte aussieht (ich habe die Ausgabe gekürzt):

{300=0, 1600=0, 200=0, ... , 2200=0}

Ich habe auch versucht, mit einem c:forEach, aber ich erhalte die gleichen Ergebnisse. Hat jemand eine Idee, was ich falsch mache?

Danke für jeden Beitrag, Lee

12voto

Berkay Punkte 1428

Mit el 2.2-Unterstützung können Sie Karten wie unten beschrieben iterieren.

<ui:repeat value="#{myBean.stats.keySet().toArray()}" var="x">
    <h:outputText value="#{myBean.stats.get(x)}" /><br />
</ui:repeat>

10voto

Lincoln Punkte 3106

<ui:repeat> akzeptiert nur List oder DataModel, nicht Sets oder Maps. Dies steht auf der Roadmap für JSF 2.1.

1voto

McDowell Punkte 105255

Drei Dinge fallen mir dazu ein:

1.

Le site Dokumentation für ui:repeat sagt es nicht (es sagt nur Liste ), aber wie ich sehe, verwendet UIRepeat DataModel als sein Modell (in der Art von h:dataTable). Karte wird nicht automatisch mit einer DataModel type - der Typ wird nicht implizit unterstützt. Sie müssen entweder den Wert zu einer Instanz Ihres eigenen DataModel Implementierung oder als implizit unterstützter Typ zur Verfügung stellen (z. B. java.util.Liste ).

2.

Ich bin mir nicht sicher, was Sie mit diesen Werten bezwecken:

${item}
${item.key}
${item.item}

Wenn Sie "Disziplin" in den Typ Liste<Map.Entry<String,String>> können Sie sich an den Schlüssel und Wert Eigenschaften:

${item.key}
${item.value}

Sie können Ihre Liste wie folgt erstellen:

Map<String, String> facetValues = new HashMap<String, String>();
// Filling the map
List<Map.Entry<String, String>> discipline
        = new ArrayList<Map.Entry<String, String>>(facetValues.entrySet());

3.

Le site FAQ schlägt vor dass JSTL-Tags nur zum Zeitpunkt der Erstellung des Komponentenbaums ausgewertet werden. Es ist mir unklar, ob die Verwendung von c:out als Kind von ui:repeat richtig funktioniert. Möglicherweise müssen Sie stattdessen h:outputText verwenden. (Ich könnte mich natürlich irren - ich habe es nicht ausprobiert.)


In einem Servlet füge ich der Anfrage Folgendes hinzu

Das klingt wie eine seltsame Art und Weise, etwas in Anfragebereich in JSF zu setzen, aber ich vertraue darauf, dass Sie wissen, was Sie tun!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X