问题
如何在JSP中循环访问aHashMap
?
<%
HashMap<String, String> countries = MainUtils.getCountries(l);
%>
<select name="country">
<%
// Here I need to loop through countries.
%>
</select>
#1 热门回答(282 赞)
就像在普通Java代码中一样。
for (Map.Entry<String, String> entry : countries.entrySet()) {
String key = entry.getKey();
String value = entry.getValue();
// ...
}
但是,scriptlets(JSP文件中的原始Java代码,那些28932294th)被认为是apoor practice。我建议安装JSTL(只需删除/WEB-INF/lib
中的JAR文件并在JSP顶部声明所需的taglibs)。它有一个<c:forEach>
tag,可以迭代Map
s。每次迭代都会给你aMap.Entry
back,而后者又有getKey()
和getValue()
方法。
这是一个基本的例子:
<%@ 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>
因此,你的特定问题可以解决如下:
<%@ 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>
你需要aServlet
或aServletContextListener
将${countries}
放置在所需范围内。如果此列表应该是基于请求的,那么请使用Servlet
的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
的contextInitialized()
,它将只加载一次并保存在内存中:
public void contextInitialized(ServletContextEvent event) {
Map<String, String> countries = MainUtils.getCountries();
event.getServletContext().setAttribute("countries", countries);
}
在这两种情况下,countries
都将在ELby${countries}
中提供。
希望这可以帮助。
也可以看看:
- 使用JSTL <c:forEach>标记迭代List和Map的元素
- 如何在<c:forEach>中迭代嵌套映射
- 如何使用JSTL迭代HashMap中的ArrayList?
- 使用特殊的自动启动servlet在启动时初始化并共享应用程序数据
#2 热门回答(1 赞)
根据你想要在循环中完成的内容,迭代其中一个:
- countries.keySet()
- countries.entrySet()
- countries.values()