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/lib
et déclarez les taglibs nécessaires en haut de JSP). Il a une <c:forEach>
balise qui peut parcourir entre autres Map
s. Chaque itération vous donnera un Map.Entry
retour 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 Servlet
ou d'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 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 ServletContextListener
les 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 countries
sera 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 partnerTypesMap
chose 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 foreach
pour les imprimer une par une.
<c:forEach items="${partnerTypesMap}" var="partnerTypesMap">
<form:option value="${partnerTypesMap['value']}">${partnerTypesMap['key']}</form:option>
</c:forEach>
HashMap
est par nature non ordonné. Êtes-vous certain de ne pas avoir besoin deTreeMap
(tri automatique par clé) ouLinkedHashMap
(maintien de l'ordre d'insertion)?