就像在普通 Java 代码中所做的一样。
for (Map.Entry<String, String> entry : countries.entrySet()) {
String key = entry.getKey();
String value = entry.getValue();
// ...
}
However, 小脚本(JSP 文件中的原始 Java 代码,那些<% %>
事物)被认为是不良做法。我建议安装JSTL。它有一个<c:forEach>可以迭代的标签Map
s。每次迭代都会给你一个Map.Entry后面又依次有getKey()
and getValue()
方法。
这是一个基本示例:
<%@ taglib prefix="c" uri="jakarta.tags.core" %>
<c:forEach items="${map}" var="entry">
Key = ${entry.key}, value = ${entry.value}<br>
</c:forEach>
因此,您的特定问题可以按如下方式解决:
<%@ taglib prefix="c" uri="jakarta.tags.core" %>
<select name="country">
<c:forEach items="${countries}" var="country">
<option value="${country.key}">${country.value}</option>
</c:forEach>
</select>
你需要一个Servlet
or a ServletContextListener
放置${countries}
在想要的范围内。如果该列表应该是基于请求的,则使用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);
}
或者,如果该列表应该是应用程序范围的常量,则使用ServletContextListener
's contextInitialized()
这样它只会被加载一次并保存在内存中:
public void contextInitialized(ServletContextEvent event) {
Map<String, String> countries = MainUtils.getCountries();
event.getServletContext().setAttribute("countries", countries);
}
在这两种情况下countries
将在EL by ${countries}
.
也可以看看:
- 使用 JSTL 标签迭代 List 和 Map 的元素
- 如何迭代 中的嵌套映射
- 如何使用 JSTL 迭代 HashMap 中的 ArrayList?
- 使用特殊的自动启动 servlet 在启动时进行初始化并共享应用程序数据