¿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>
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>
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 Map
s. 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.
@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
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>
Por cierto, un
HashMap
es por naturaleza desordenado. ¿Estás seguro de que no necesitasTreeMap
(clasificación automática por clave) oLinkedHashMap
(mantiene orden de inserción)?– BalusC
2 de diciembre de 2009 a las 21:27