Comment puis-je parcourir une HashMap
dans JSP?
<%
HashMap<String, String> countries = MainUtils.getCountries(l);
%>
<select name="country">
<%
// Here I need to loop through countries.
%>
</select>
De la même manière que vous le feriez dans un code Java normal.
_for (Map.Entry<String, String> entry : countries.entrySet()) {
String key = entry.getKey();
String value = entry.getValue();
// ...
}
_
Cependant , scriptlets (raw Java code dans des fichiers JSP, ces _<% %>
_)) est considéré comme un mauvaise pratique . Je recommande d'installer JSTL (il suffit de déposer le fichier JAR dans _/WEB-INF/lib
_ et de déclarer le nécessaire taglibs en haut de JSP). Il a une balise <c:forEach>
qui peut parcourir entre autres Map
s. Chaque itération vous donnera un Map.Entry
qui a à son tour des méthodes getKey()
et getValue()
.
Voici un exemple de base:
_<%@ 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>
_
Ainsi, votre problème particulier peut être résolu comme suit:
_<%@ 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>
_
Vous avez besoin d'un Servlet
ou d'un ServletContextListener
pour placer le _${countries}
_ dans la portée souhaitée. Si cette liste est supposée être basée sur une requête, utilisez alors la doGet()
de Servlet
:
_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);
}
_
Ou si cette liste est supposée être une constante à l'échelle de l'application, utilisez alors contextInitialized()
de ServletContextListener
pour qu'elle ne soit chargée qu'une seule fois et conservée en mémoire:
_public void contextInitialized(ServletContextEvent event) {
Map<String, String> countries = MainUtils.getCountries();
event.getServletContext().setAttribute("countries", countries);
}
_
Dans les deux cas, la countries
sera disponible dans EL par _${countries}
_.
J'espère que cela t'aides.
En fonction de ce que vous souhaitez accomplir dans la boucle, parcourez l'un de ces éléments:
countries.keySet()
countries.entrySet()
countries.values()