¿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>
¿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>
Respuestas:
De la misma manera que lo haría en un código Java normal.
for (Map.Entry<String, String> entry : countries.entrySet()) {
String key = entry.getKey();
String value = entry.getValue();
// ...
}
Sin embargo , los scriptlets (código Java sin procesar en archivos JSP, esas <% %>
cosas) se consideran una mala práctica . Recomiendo instalar JSTL (simplemente suelte el archivo JAR /WEB-INF/lib
y declare los taglibs necesarios en la parte superior de JSP). Tiene una <c:forEach>
etiqueta que puede iterar entre otras Map
. Cada iteración le dará un Map.Entry
respaldo que a su vez tiene getKey()
y getValue()
métodos.
Aquí hay 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>
Necesita a Servlet
o a ServletContextListener
para colocar el ${countries}
en el alcance deseado. Si se supone que esta lista está basada en una solicitud, 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 de toda la aplicación, use ServletContextListener
's' contextInitialized()
para que se cargue solo una vez y se guarde en la memoria:
public void contextInitialized(ServletContextEvent event) {
Map<String, String> countries = MainUtils.getCountries();
event.getServletContext().setAttribute("countries", countries);
}
En ambos casos countries
, estará disponible en EL por ${countries}
.
Espero que esto ayude.
Dependiendo de lo que desee lograr dentro del ciclo, repita uno de estos en su lugar:
countries.keySet()
countries.entrySet()
countries.values()
El siguiente código me funciona
Primero definí el partnerTypesMap
siguiente como 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);
Cuando renderizo la página que uso a continuación foreach
para imprimirlas una por una.
<c:forEach items="${partnerTypesMap}" var="partnerTypesMap">
<form:option value="${partnerTypesMap['value']}">${partnerTypesMap['key']}</form:option>
</c:forEach>
HashMap
es desordenado por naturaleza. ¿Está seguro de que no necesitaTreeMap
(clasificación automática por clave) oLinkedHashMap
(mantiene el orden de inserción)?