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

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

138 голосов
/ 02 декабря 2009

Как пройти через HashMap в JSP?

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

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

Ответы [ 2 ]

297 голосов
/ 02 декабря 2009

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

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

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

Вам понадобится Servlet или ServletContextListener, чтобы поместить ${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 будет доступен в EL до ${countries}.

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

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

1 голос
/ 02 декабря 2009

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

  • countries.keySet()
  • countries.entrySet()
  • countries.values()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...