¿Cómo recorrer un HashMap en JSP?

4 minutos de lectura

¿Como recorrer un HashMap en JSP
lloriquear

¿Cómo puedo recorrer un HashMap en JSP?

<%
    HashMap<String, String> countries = MainUtils.getCountries(l);
%>

<select name="country">
    <% 
        // Here I need to loop through countries.
    %>
</select>

  • Por cierto, un HashMap es por naturaleza desordenado. ¿Estás seguro de que no necesitas TreeMap (clasificación automática por clave) o LinkedHashMap (mantiene orden de inserción)?

    – BalusC

    2 de diciembre de 2009 a las 21:27

¿Como recorrer un HashMap en JSP
BalusC

De la misma manera que lo haría en el código Java normal.

for (Map.Entry<String, String> entry : countries.entrySet()) {
    String key = entry.getKey();
    String value = entry.getValue();
    // ...
}

Sin embargo, guiones (código Java sin procesar en archivos JSP, esos <% %> cosas) se consideran una mala práctica. recomiendo instalar JSTL (simplemente suelte el archivo JAR en /WEB-INF/lib y declarar lo necesario etiquetas en la parte superior de JSP). Tiene un <c:forEach> etiqueta que puede iterar entre otras Maps. Cada iteración le dará una Map.Entry espalda que a su vez tiene getKey() y getValue() métodos.

He aquí un ejemplo básico:

<%@ 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>

Por lo tanto, su problema particular se puede resolver de la siguiente manera:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<select name="country">
    <c:forEach items="${countries}" var="country">
        <option value="${country.key}">${country.value}</option>
    </c:forEach>
</select>

Tu necesitas un Servlet o un ServletContextListener para colocar el ${countries} en el alcance deseado. Si se supone que esta lista está basada en solicitudes, utilice el Servlet‘s doGet():

protected void doGet(HttpServletRequest request, HttpServletResponse response) {
    Map<String, String> countries = MainUtils.getCountries();
    request.setAttribute("countries", countries);
    request.getRequestDispatcher("/WEB-INF/page.jsp").forward(request, response);
}

O si se supone que esta lista es una constante para toda la aplicación, utilice ServletContextListener‘s contextInitialized() para que se cargue solo una vez y se guarde en memoria:

public void contextInitialized(ServletContextEvent event) {
    Map<String, String> countries = MainUtils.getCountries();
    event.getServletContext().setAttribute("countries", countries);
}

En ambos casos el countries estará disponible en EL por ${countries}.

Espero que esto ayude.

Ver también:

  • Iterar sobre elementos de Lista y Mapa usando la etiqueta JSTL
  • Cómo iterar sobre un mapa anidado en
  • ¿Cómo iterar una ArrayList dentro de un HashMap usando JSTL?
  • Usar un servlet especial de inicio automático para inicializar en el inicio y compartir datos de la aplicación

  • @Khue: sí, también puedes poner atributos en la sesión. Solo que no veo por qué le gustaría duplicar datos de toda la aplicación en varias sesiones.

    – BalusC

    26 de octubre de 2011 a las 11:25


  • Creo que en el caso de información basada en sesiones. Gracias por la explicación muy agradable.

    – Jue Vu

    27 de octubre de 2011 a las 3:56

  • Estoy seguro de que la respuesta es obvia, pero ¿por qué los scriptlets se consideran una mala práctica? En ausencia de JSTL debido al mantenimiento de una aplicación heredada, esta es mi única opción.

    – Zibbobz

    25 mayo 2018 a las 18:32

  • @Zibbobz: el texto “mala práctica” es un enlace. Haz click en eso.

    – BalusC

    25 mayo 2018 a las 18:34

1646749210 486 ¿Como recorrer un HashMap en JSP
guarnición de jim

Dependiendo de lo que desee lograr dentro del ciclo, itere sobre uno de estos en su lugar:

  • countries.keySet()
  • countries.entrySet()
  • countries.values()

  • sí, con esto obtengo todo el conjunto de claves, pero ¿cómo puedo integrarlo en un campo de selección para html?

    – blasfemia

    2 de diciembre de 2009 a las 21:35

  • esto no responde a la pregunta que es específica sobre JSP

    – Taoufik Mohdit

    2 de junio de 2015 a las 13:25

El siguiente código funciona para mí.

primero definí el partnerTypesMap como abajo en el lado del servidor,

Map<String, String> partnerTypes = new HashMap<>();

después de agregarle valores, agregué el objeto a model,

model.addAttribute("partnerTypesMap", partnerTypes);

Al renderizar la página que uso a continuación foreach para imprimirlos uno por uno.

<c:forEach items="${partnerTypesMap}" var="partnerTypesMap">
      <form:option value="${partnerTypesMap['value']}">${partnerTypesMap['key']}</form:option>
</c:forEach>

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad