¿Cómo iterar un ArrayList dentro de un HashMap usando JSTL?
Tengo un mapa como este
Map<Integer,ArrayList<Object>> myMap = new LinkedHashMap<Integer,ArrayList<Object>>();
Ahora tengo que iterar este Mapa y luego el ArrayList dentro del mapa. ¿Cómo puedo hacer esto usando JSTL?
Puede utilizar la etiqueta JSTL <c:forEach>
para iterar sobre matrices, colecciones y mapas.
En el caso de matrices y colecciones, cada iteración var
le proporcionará de inmediato solo el elemento iterado actualmente.
<%@ 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 var
le dará un Map.Entry
objeto que a su vez tiene getKey()
métodos 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, en ${entry.value}
realidad es un List
, por lo que también debe iterarlo:
<%@ 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>
Está varStatus
ahí sólo por conveniencia;)
Para comprender 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:
- ¿Cómo recorrer un HashMap en JSP?
- Muestre JDBC ResultSet en HTML en la página JSP usando el patrón MVC y DAO
- ¿Cómo recorrer algo un número específico de veces en JSTL?
¿Intentaste algo como esto?
<c:forEach var='item' items='${map}'>
<c:forEach var='arrayItem' items='${item.value}' />
...
</c:forEach>
</c:forEach>
No has cerrado la etiqueta c. Prueba 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>