Réponses:
De la même manière que vous le feriez avec du code Java normal.
for (Map.Entry<String, String> entry : countries.entrySet()) {
String key = entry.getKey();
String value = entry.getValue();
// ...
}
Cependant , les scriptlets (code Java brut dans les fichiers JSP, ces <% %>choses) sont considérés comme une mauvaise pratique . Je recommande d'installer JSTL (déposez simplement le fichier JAR /WEB-INF/libet déclarez les taglibs nécessaires en haut de JSP). Il a une <c:forEach>balise qui peut parcourir entre autres Maps. Chaque itération vous donnera un Map.Entryretour qui à son tour a getKey()et des 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>
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 Servletou d'un ServletContextListenerpour placer le ${countries}dans la portée souhaitée. Si cette liste est censée être basée sur des requêtes, utilisez les 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 supposée être une constante à l'échelle de l'application, utilisez ServletContextListenerles contextInitialized()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, le countriessera disponible en EL par ${countries}.
J'espère que cela t'aides.
En fonction de ce que vous souhaitez accomplir dans la boucle, parcourez plutôt l'un de ces éléments:
countries.keySet()countries.entrySet()countries.values()Le code ci-dessous fonctionne pour moi
J'ai d'abord défini la même partnerTypesMapchose ci-dessous côté serveur,
Map<String, String> partnerTypes = new HashMap<>();
après avoir ajouté des valeurs, j'ai ajouté l'objet à model,
model.addAttribute("partnerTypesMap", partnerTypes);
Lors du rendu de la page, j'utilise ci-dessous foreachpour les imprimer une par une.
<c:forEach items="${partnerTypesMap}" var="partnerTypesMap">
<form:option value="${partnerTypesMap['value']}">${partnerTypesMap['key']}</form:option>
</c:forEach>
HashMapest par nature non ordonné. Êtes-vous certain de ne pas avoir besoin deTreeMap(tri automatique par clé) ouLinkedHashMap(maintien de l'ordre d'insertion)?