web-dev-qa-db-fra.com

Comment boucler un HashMap dans JSP?

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>
138
blub

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 Maps. 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.

Voir également:

297
BalusC

En fonction de ce que vous souhaitez accomplir dans la boucle, parcourez l'un de ces éléments:

  • countries.keySet()
  • countries.entrySet()
  • countries.values()
1
Jim Garrison