Jawaban:
Sama seperti yang Anda lakukan pada kode Java normal.
for (Map.Entry<String, String> entry : countries.entrySet()) {
String key = entry.getKey();
String value = entry.getValue();
// ...
}
Namun , scriptlets (kode Java mentah dalam file JSP, <% %>hal - hal itu) dianggap praktik yang buruk . Saya sarankan untuk menginstal JSTL (cukup masukkan file JAR /WEB-INF/libdan nyatakan taglibs yang diperlukan di atas JSP). Ini memiliki <c:forEach>tag yang dapat beralih di antara yang lain Map. Setiap iterasi akan memberi Anda Map.Entrypunggung yang pada gilirannya memiliki getKey()dan getValue()metode.
Inilah contoh dasar:
<%@ 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>
Dengan demikian masalah khusus Anda dapat diselesaikan sebagai berikut:
<%@ 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>
Anda perlu a Servletatau a ServletContextListeneruntuk menempatkannya ${countries}dalam ruang lingkup yang diinginkan. Jika daftar ini seharusnya berdasarkan permintaan, maka gunakan 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);
}
Atau jika daftar ini seharusnya menjadi konstan aplikasi-lebar, kemudian menggunakan ServletContextListener's contextInitialized()sehingga akan dimuat hanya sekali dan disimpan dalam memori:
public void contextInitialized(ServletContextEvent event) {
Map<String, String> countries = MainUtils.getCountries();
event.getServletContext().setAttribute("countries", countries);
}
Dalam kedua kasus itu countriesakan tersedia di EL oleh ${countries}.
Semoga ini membantu.
Bergantung pada apa yang ingin Anda capai dalam loop, beralihlah ke salah satu dari ini:
countries.keySet()countries.entrySet()countries.values()Kode di bawah ini berfungsi untuk saya
pertama saya mendefinisikan partnerTypesMapseperti di bawah ini di sisi server,
Map<String, String> partnerTypes = new HashMap<>();
setelah menambahkan nilai, saya menambahkan objek ke model,
model.addAttribute("partnerTypesMap", partnerTypes);
Saat merender halaman yang saya gunakan di bawah ini foreachuntuk mencetaknya satu per satu.
<c:forEach items="${partnerTypesMap}" var="partnerTypesMap">
<form:option value="${partnerTypesMap['value']}">${partnerTypesMap['key']}</form:option>
</c:forEach>
HashMapsecara alami tidak teratur. Apakah Anda yakin tidak perluTreeMap(mengurutkan menurut kunci) atauLinkedHashMap(mempertahankan urutan penyisipan)?