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>