154 votes

Comment boucler dans un HashMap en JSP ?

Comment puis-je faire une boucle dans un HashMap en JSP ?

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

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

18 votes

Au fait, un HashMap est par nature non ordonnée. Etes-vous certain que vous n'avez pas besoin TreeMap (tri automatique par clé) ou LinkedHashMap (maintient l'ordre d'insertion) ?

325voto

BalusC Points 498232

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 (code Java brut dans les fichiers JSP, ces <% %> choses) sont considérées comme un mauvaise pratique . Je recommande d'installer JSTL (il suffit de déposer le fichier JAR dans /WEB-INF/lib et déclarer les taglibs au dessus de JSP). Il possède un <c:forEach> qui peut itérer sur entre autres Map s. Chaque itération vous donnera un Map.Entry qui, à son tour, a getKey() y getValue() méthodes.

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>

Votre problème particulier peut donc ê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 un ServletContextListener pour placer le ${countries} dans la portée souhaitée. Si cette liste est censée être basée sur des requêtes, utilisez alors l'option 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);
}

Ou si cette liste est censée être une constante pour toute l'application, alors utilisez ServletContextListener 's contextInitialized() afin qu'il ne soit chargé qu'une seule fois et conservé en mémoire :

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

Dans les deux cas, le countries sera disponible en EL por ${countries} .

J'espère que cela vous aidera.

Voir aussi :

2 votes

@Khue : oui, vous pouvez aussi mettre des attributs dans la session. Seulement, je ne vois pas pourquoi vous voudriez dupliquer les données de l'application sur plusieurs sessions.

0 votes

Je pense que dans le cas d'informations basées sur la session. Merci pour cette très belle explication.

0 votes

Je suis sûr que la réponse est évidente, mais pourquoi les scriptlets sont-ils considérés comme une mauvaise pratique ? En l'absence de JSTL en raison de la maintenance d'une ancienne application, c'est ma seule option.

2voto

Jim Garrison Points 39523

En fonction de ce que vous voulez accomplir dans la boucle, vous pouvez itérer sur l'un de ces éléments à la place :

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

0 votes

Oui, avec cette méthode, j'obtiens un ensemble de clés mais comment puis-je l'intégrer dans un champ de sélection pour le html ?

7 votes

Cela ne répond pas à la question qui concerne spécifiquement les JSP.

0voto

thusharaK Points 765

Le code ci-dessous fonctionne pour moi

J'ai d'abord défini le partnerTypesMap comme ci-dessous du côté serveur,

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

après lui avoir ajouté des valeurs, j'ai ajouté l'objet à model ,

model.addAttribute("partnerTypesMap", partnerTypes);

Lors du rendu de la page, j'utilise les éléments suivants foreach pour les imprimer un par un.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X