2009-05-12 5 views
3

Ich habe einige Schwierigkeiten beim Durchlaufen einer HashMap, um ihre Werte auf dem Bildschirm auszugeben. Könnte jemand meinen Code überprüfen, um zu sehen, was ich falsch mache? Ich kann nichts falsch finden, aber es muss etwas geben.Probleme, die über eine HashMap mit JSF, MyFaces & Facelets iterieren

In einem Servlet, Ich füge die folgenden auf die Anfrage:

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

In einem Fall "facetField.getName()" wertet "Disziplin" zu. Also in meiner Seite habe ich 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 ausgeführt, aber alle Ausgänge sind leer?!? Ich hätte zumindest etwas im Item erwartet, wenn es einmal über die Schleife gegangen ist. Überprüfen Sie das Debug-Popup für Facelets, Disziplin ist da und auf der Schleife. Drucken sie den Bildschirm führt zu etwas, das für mich wie eine Karte sieht (ich habe die Ausgabe gekürzt):

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

ich auch mit einem c versucht haben: forEach aber ich bin die gleichen Ergebnisse zu erzielen. Hat jemand irgendwelche Ideen, wo ich falsch liege?

Vielen Dank für jede Eingabe, Lee

+0

Kannst du klarstellen: Siehst du "Gegenstand :, Schlüssel :, Wert:" für jedes Element in der Karte (aber die tatsächlichen Werte werden nicht gedruckt)? – mtpettyp

+0

Nicht für jeden Wert. Die Schleife iteriert nur einmal. Aber ich bin mir ziemlich sicher, dass ich die richtige HashMap in die Schleife gebe. –

Antwort

10

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

1

Drei Dinge fallen mir:

1.

Die documentation for ui:repeat es nicht sagen (es sagt nur Liste), aber ich sehe UIRepeat verwendet DataModel als sein Modell (in der Art von h: dataTable). Karte wird nicht automatisch mit einem DataModel Typ umbrochen - der Typ wird nicht implizit unterstützt. Sie müssen den Wert entweder als eigene Instanz DataModel implementieren oder als implizit unterstützten Typ angeben (z. B. java.util.List).

2.

Ich bin nicht sicher, was Sie diese Werte abbilden wollen:

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

Wenn Sie "Disziplin" ändern < Map.Entry < String vom Typ Liste zu sein, String > >, könnten Sie zu den key and value Eigenschaften binden:

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

Sie können Ihre Liste wie so 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.

Die FAQ suggests, die JSTL-Tags an Komponentenbaum Erstellungszeit nur ausgewertet werden. Es ist mir unklar, ob c: out als Kind von ui: repeat funktioniert. Möglicherweise müssen Sie stattdessen h: outputText verwenden. (Ich könnte natürlich falsch liegen, ich habe es nicht versucht.

)

In einem Servlet, Ich füge die folgenden auf die Anfrage

, die wie eine seltsame Art und Weise klingt etwas in Anfrage Umfang in JSF zu setzen, aber ich werde, dass Sie vertrauen weiß was du tust!

12

mit el 2.2 Unterstützung können Sie Karten wie unten iterieren.

+0

Prost Berkay, ersparte mir eine Menge Ärger. –