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/lib
dan 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.Entry
punggung 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 Servlet
atau a ServletContextListener
untuk 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 countries
akan 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 partnerTypesMap
seperti 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 foreach
untuk mencetaknya satu per satu.
<c:forEach items="${partnerTypesMap}" var="partnerTypesMap">
<form:option value="${partnerTypesMap['value']}">${partnerTypesMap['key']}</form:option>
</c:forEach>
HashMap
secara alami tidak teratur. Apakah Anda yakin tidak perluTreeMap
(mengurutkan menurut kunci) atauLinkedHashMap
(mempertahankan urutan penyisipan)?