如何在JSP中遍历HashMap?

154

如何在 JSP 中遍历 HashMap

<%
    HashMap<String, String> countries = MainUtils.getCountries(l);
%>

<select name="country">
    <% 
        // Here I need to loop through countries.
    %>
</select>

18
顺便说一下,HashMap 本质上是无序的。你确定不需要 TreeMap(键排序)或者 LinkedHashMap(维护插入顺序)吗? - BalusC
3个回答

325

就像在普通的Java代码中一样。

for (Map.Entry<String, String> entry : countries.entrySet()) {
    String key = entry.getKey();
    String value = entry.getValue();
    // ...
}

然而,JSP文件中的脚本代码(即那些<% %>的东西)被认为是一种不良实践。我建议安装JSTL(只需将JAR文件放入/ WEB-INF / lib 并在JSP顶部声明所需的taglibs即可)。它有一个<c:forEach> 标签,可以循环遍历其他 Map 。每次迭代都会返回一个 Map.Entry ,该条目反过来具有 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>

您需要一个ServletServletContextListener来将${countries}放置在所需的范围内。如果此列表应基于请求,则使用ServletdoGet()
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);
}

如果这个列表是应用程序范围内的常量,那么请使用ServletContextListenercontextInitialized()方法,以便它只会被加载一次并保存在内存中:
public void contextInitialized(ServletContextEvent event) {
    Map<String, String> countries = MainUtils.getCountries();
    event.getServletContext().setAttribute("countries", countries);
}

在这两种情况下,countries将通过${countries}EL中可用。
另请参阅:

2
@Khue:是的,您也可以将属性放入会话中。我只是不明白为什么您想要在多个会话中复制应用程序范围的数据。 - BalusC
我认为在基于会话的信息方面。感谢您提供非常好的解释。 - Khue Vu
我相信答案很明显,但是为什么脚本片段被认为是不良实践呢?由于维护遗留应用程序而缺乏JSTL,这是我的唯一选择。 - Zibbobz
@Zibbobz:文本“poor practice”是一个链接。请点击它。 - BalusC

2
根据您想在循环中完成的任务,选择以下其中之一进行迭代:
  • countries.keySet():遍历键
  • countries.entrySet():遍历键值对
  • countries.values():遍历值

是的,我可以获取所有键集,但如何将其集成到 HTML 的选择字段中呢? - blub
8
翻译英语到中文。仅返回翻译后的文本:这并不回答关于JSP的具体问题。 - Taoufik Mohdit

0

以下代码对我有效:

首先在服务器端定义了如下的partnerTypesMap

Map<String, String> partnerTypes = new HashMap<>();

在给它添加值后,我将对象添加到model中。

model.addAttribute("partnerTypesMap", partnerTypes);

在渲染页面时,我使用以下的foreach来逐个打印它们。
<c:forEach items="${partnerTypesMap}" var="partnerTypesMap">
      <form:option value="${partnerTypesMap['value']}">${partnerTypesMap['key']}</form:option>
</c:forEach>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接