Как перебрать HashMap в JSP?

Как я могу перебрать HashMap в JSP?

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

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

person blub    schedule 02.12.2009    source источник
comment
Кстати, HashMap по своей природе неупорядочен. Вы уверены, что вам не нужны TreeMap (автоматическая сортировка по ключу) или LinkedHashMap (сохраняет порядок вставки)?   -  person BalusC    schedule 03.12.2009


Ответы (3)


Точно так же, как в обычном Java-коде.

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

Однако скриптлеты (необработанный код Java в файлах JSP, эти <% %> штуки) считаются плохая практика. Я рекомендую установить JSTL (просто перетащите файл JAR в /WEB-INF/lib и объявите необходимые taglib в верхней части JSP) . Он имеет тег <c:forEach>, который может перебирать среди прочих Maps. Каждая итерация будет давать вам Map.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>

Вам нужен Servlet или ServletContextListener, чтобы поместить ${countries} в желаемый прицел. Если этот список должен быть основан на запросе, используйте doGet() Servlet:

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);
}

Или, если этот список должен быть константой для всего приложения, используйте contextInitialized() ServletContextListener, чтобы он загружался только один раз и сохранялся в памяти:

public void contextInitialized(ServletContextEvent event) {
    Map<String, String> countries = MainUtils.getCountries();
    event.getServletContext().setAttribute("countries", countries);
}

В обоих случаях countries будет доступен в EL через ${countries}.

Надеюсь это поможет.

Смотрите также:

person BalusC    schedule 02.12.2009
comment
@Khue: да, вы также можете поместить атрибуты в сеанс. Я только не понимаю, почему вы хотите дублировать данные приложения в нескольких сеансах. - person BalusC; 26.10.2011
comment
Я думаю, что в случае сеансовой информации. Спасибо за очень хорошее объяснение. - person Khue Vu; 27.10.2011
comment
Я уверен, что ответ очевиден, но почему скриптлеты считаются плохой практикой? В отсутствие JSTL из-за поддержки устаревшего приложения это мой единственный вариант. - person Zibbobz; 25.05.2018
comment
@Zibbobz: плохая практика текста - это ссылка. Нажмите здесь. - person BalusC; 25.05.2018

В зависимости от того, что вы хотите выполнить в цикле, вместо этого выполните итерацию по одному из них:

  • countries.keySet()
  • countries.entrySet()
  • countries.values()
person Jim Garrison    schedule 02.12.2009
comment
да, с этим я получаю набор всех ключей, но как я могу интегрировать его в поле выбора для html? - person blub; 03.12.2009
comment
это не отвечает на вопрос, который специфичен для JSP - person Taoufik Mohdit; 02.06.2015

Ниже код работает для меня

сначала я определил 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>
person tk_    schedule 03.10.2019