java jsp map arraylist jstl

java - ¿Cómo iterar una ArrayList dentro de un HashMap usando JSTL?



jsp (4)

¿Has probado algo como esto?

<c:forEach var=''item'' items=''${map}''> <c:forEach var=''arrayItem'' items=''${item.value}'' /> ... </c:forEach> </c:forEach>

Tengo un mapa como este,

Map<Integer,ArrayList<Object>> myMap = new LinkedHashMap<Integer,ArrayList<Object>>();

Ahora tengo que repetir este Mapa y luego ArrayList dentro del mapa. ¿Cómo puedo hacer esto usando JSTL?


Puede usar la etiqueta JSTL <c:forEach> para iterar sobre matrices, colecciones y mapas.

En el caso de las matrices y colecciones, cada iteración la var le dará solo el elemento iterado actualmente de inmediato.

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <c:forEach items="${collectionOrArray}" var="item"> Item = ${item}<br> </c:forEach>

En el caso de los mapas, cada iteración la var le dará un objeto Map.Entry que a su vez tiene los getKey() y getValue() .

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <c:forEach items="${map}" var="entry"> Key = ${entry.key}, value = ${entry.value}<br> </c:forEach>

En su caso particular, ${entry.value} es en realidad una List , por lo que también debe iterar sobre ella:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <c:forEach items="${map}" var="entry"> Key = ${entry.key}, values = <c:forEach items="${entry.value}" var="item" varStatus="loop"> ${item} ${!loop.last ? '', '' : ''''} </c:forEach><br> </c:forEach>

El varStatus está ahí solo por conveniencia;)

Para entender mejor lo que está sucediendo aquí, aquí hay una traducción simple de Java:

for (Entry<String, List<Object>> entry : map.entrySet()) { out.print("Key = " + entry.getKey() + ", values = "); for (Iterator<Object> iter = entry.getValue().iterator(); iter.hasNext();) { Object item = iter.next(); out.print(item + (iter.hasNext() ? ", " : "")); } out.println(); }

Ver también:


También puede recorrer el mapa solo. Valórelo si conoce la clave

<c:forEach var="value" items="${myMap[myObject.someInteger]}"> ${value} </c:forEach>


no ha cerrado la etiqueta c. intente esto

<c:forEach items="${logMap}" var="entry"> Key = ${entry.key}, values = <c:forEach items="${entry.value}" var="item" varStatus="loop"> ${item} ${!loop.last ? '', '' : ''''} </c:forEach><br> </c:forEach>