Antworten:
Genau wie bei normalem Java-Code.
for (Map.Entry<String, String> entry : countries.entrySet()) {
String key = entry.getKey();
String value = entry.getValue();
// ...
}
Allerdings , Scriptlets (raw Java - Code in JSP - Dateien, diese <% %>
Dinge) ist eine als schlechte Praxis . Ich empfehle, JSTL zu installieren (legen Sie einfach die JAR-Datei ab /WEB-INF/lib
und deklarieren Sie die erforderlichen Taglibs über JSP). Es hat ein <c:forEach>
Tag, das unter anderem über iterieren kann Map
. Jede Iteration wird Ihnen eine Map.Entry
Rückseite , die wiederum hat getKey()
und getValue()
Methoden.
Hier ist ein einfaches Beispiel:
<%@ 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>
Somit kann Ihr spezielles Problem wie folgt gelöst werden:
<%@ 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>
Sie benötigen ein Servlet
oder ein ServletContextListener
, um das ${countries}
in den gewünschten Bereich zu platzieren. Wenn diese Liste anforderungsbasiert sein soll, verwenden Sie Servlet
Folgendes 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);
}
Oder wenn diese Liste eine anwendungsweite Konstante sein soll, verwenden Sie ServletContextListener
's, contextInitialized()
damit sie nur einmal geladen und gespeichert wird:
public void contextInitialized(ServletContextEvent event) {
Map<String, String> countries = MainUtils.getCountries();
event.getServletContext().setAttribute("countries", countries);
}
In beiden Fällen countries
wird der in EL von verfügbar sein ${countries}
.
Hoffe das hilft.
Je nachdem, was Sie in der Schleife erreichen möchten, durchlaufen Sie stattdessen eine der folgenden Optionen:
countries.keySet()
countries.entrySet()
countries.values()
Der folgende Code funktioniert für mich
Zuerst habe ich das partnerTypesMap
Gleiche unten auf der Serverseite definiert.
Map<String, String> partnerTypes = new HashMap<>();
Nachdem ich Werte hinzugefügt hatte, fügte ich das Objekt hinzu model
.
model.addAttribute("partnerTypesMap", partnerTypes);
Beim Rendern der Seite verwende ich unten foreach
, um sie einzeln zu drucken.
<c:forEach items="${partnerTypesMap}" var="partnerTypesMap">
<form:option value="${partnerTypesMap['value']}">${partnerTypesMap['key']}</form:option>
</c:forEach>
HashMap
ist übrigens von Natur aus ungeordnet. Sind Sie sicher, dass Sie dies nicht benötigenTreeMap
(automatische Sortierung nach Schlüssel) oderLinkedHashMap
(Beibehaltungsreihenfolge beibehalten)?