2012-08-09 14 views
5

Mit einer ForEach-Schleife möchte ich Tabellenzellen (für eine Zeile) erstellen, während jede Zelle ein Eingabefeld eines Formulars enthält. Die Anzahl der Tabellenzellen ist immer fest (12). Das ist eigentlich kein Problem. Hier kommt jedoch die Herausforderung: Das forEach sollte auch eine variable Anzahl von Default-Werten in die Eingabefelder eintragen, die von einer Map (Long, Double) erhalten werden müssen.Wie verwende ich die Indexvariable einer JSTL forEach-Schleife, um auf einen Map-Eintrag zuzugreifen?

Dies ist mein (vereinfacht) Versuch:

<c:forEach var="number" begin="1" end="12" > 
    <td> 
     <input type="text" value="${requestScope.aMapWithData[number]}" /> 
    </td> 
</c:forEach> 

Aber dies zeigt keinen Wert aus der Karte in den Eingabefeldern. Ich schätze das Problem ist, dass "Nummer" vom Typ String und nicht Long ist. Ich frage mich also, ob dieses Problem gelöst werden kann, ohne Skriptlets zu verwenden.

+1

See [Dieses Thema] (http://stackoverflow.com/questions/924451/jstl-access-a-map-value-by-key). Vor allem die akzeptierte Antwort, und [diese] (http://stackoverflow.com/a/5474399/1344008) – npe

+0

Thx für den Hinweis! Der Trick mit der impliziten Typumsetzung funktioniert sehr gut: Wert = "$ {requestScope.aMapWithData [Nummer + 0]}" – mvk

Antwort

0

diese

<c:forEach items="${aMapWithData}" var="mapEntry"> 
    <c:set var="mapKey" value="${mapEntry.key}"></c:set> 
    <c:set var="mapValue" value="${mapEntry.value}"></c:set> 
</c:forEach> 
+0

Ich lag falsch ^^ Das funktioniert nicht, da ich immer 12 Zellen brauche ... – mvk

+0

Du brauchst um die möglichen Schlüssel in Ihrer Karte anzugeben. – vikas

+0

Die möglichen Kartenschlüssel sind Zahlen (Long) zwischen 1 und 12 – mvk

7

Versuchen welche Nummer Sie zeigen möchten? Ist es die Indexnummer jedes Karteneintrags?

<c:forEach items="${aMapWithData}" var="item" varStatus="status"> 
    <td> 
     <c:out value="${status.count}."/> 
     <input type="text" name="${item.key}" value="${item.value}" /> 
    </td> 
</c:forEach> 
+0

Nein, ich möchte den tatsächlichen Wert jedes Karteneintrags anzeigen. Außerdem sollte die Anzahl der Zellen festgelegt werden (12). In Ihrer Lösung hängt die Anzahl der Zellen von der Anzahl der Karteneinträge ab. – mvk

+0

Fügen Sie einfach die Attribute 'begin' und' end' in 'forEach' hinzu. '" Und Sie erhalten das gewünschte Verhalten. – kapand

+0

Das Hinzufügen von "begin" und "end" hilft leider nicht, da sie zusammen mit dem "items" -Attribut nicht die (feste) Anzahl der Iterationen angeben, sondern vielmehr einschränken, welche Elemente der Map in den Iterationen enthalten sind. – mvk

Verwandte Themen