Câu trả lời:
Cũng giống như cách bạn làm trong mã Java thông thường.
for (Map.Entry<String, String> entry : countries.entrySet()) {
String key = entry.getKey();
String value = entry.getValue();
// ...
}
Tuy nhiên , scriptlets (mã Java thô trong các tệp JSP, những <% %>
thứ đó) được coi là một cách thực hành kém . Tôi khuyên bạn nên cài đặt JSTL (chỉ cần thả tệp JAR vào /WEB-INF/lib
và khai báo các taglib cần thiết ở trên cùng của JSP). Nó có một <c:forEach>
thẻ có thể lặp đi lặp lại giữa những người khác Map
. Mỗi lần lặp sẽ cung cấp cho bạn một Map.Entry
trở lại mà lần lượt có getKey()
và getValue()
phương thức.
Đây là một ví dụ cơ bản:
<%@ 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>
Do đó, vấn đề cụ thể của bạn có thể được giải quyết như sau:
<%@ 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>
Bạn cần một Servlet
hoặc một ServletContextListener
để đặt ${countries}
trong phạm vi mong muốn. Nếu danh sách này được coi là yêu cầu có trụ sở, sau đó sử dụng 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);
}
Hoặc nếu danh sách này được coi là hằng số toàn ứng dụng, thì hãy sử dụng ServletContextListener
nó contextInitialized()
để nó chỉ được tải một lần và được giữ trong bộ nhớ:
public void contextInitialized(ServletContextEvent event) {
Map<String, String> countries = MainUtils.getCountries();
event.getServletContext().setAttribute("countries", countries);
}
Trong cả hai trường hợp, countries
sẽ có sẵn trong EL bởi ${countries}
.
Hi vọng điêu nay co ich.
Tùy thuộc vào những gì bạn muốn thực hiện trong vòng lặp, thay vào đó hãy lặp lại một trong những điều sau:
countries.keySet()
countries.entrySet()
countries.values()
Mã dưới đây làm việc cho tôi
đầu tiên tôi xác định partnerTypesMap
như dưới đây trong phía máy chủ,
Map<String, String> partnerTypes = new HashMap<>();
Sau khi thêm giá trị vào nó, tôi đã thêm đối tượng vào model
,
model.addAttribute("partnerTypesMap", partnerTypes);
Khi kết xuất trang tôi sử dụng bên dưới foreach
để in từng cái một.
<c:forEach items="${partnerTypesMap}" var="partnerTypesMap">
<form:option value="${partnerTypesMap['value']}">${partnerTypesMap['key']}</form:option>
</c:forEach>
HashMap
là bản chất không có thứ tự. Bạn có chắc chắn không cầnTreeMap
(sắp xếp tự động theo khóa) hoặcLinkedHashMap
(duy trì thứ tự chèn)?