web-dev-qa-db-ja.com

JSPでHashMapをループする方法は?

JSPでHashMapをループするにはどうすればよいですか?

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

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

通常のJavaコードで行うのと同じ方法。

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

ただし、scriptlets(JSPファイルのraw Javaコード、それらの<% %>のもの)は、 悪い習慣 と見なされます。 JSTL をインストールすることをお勧めします(JARファイルを/WEB-INF/libにドロップして、必要な taglibs をJSPの上に宣言するだけです)。これには <c:forEach> タグがあり、他のMapsを反復処理できます。繰り返しごとに 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>

${countries}を目的のスコープに配置するには、ServletまたはServletContextListenerが必要です。このリストがリクエストベースであることになっている場合、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()を使用して、1回だけロードされ、メモリに保持されるようにします。

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

どちらの場合も、countriesは、${countries}によって EL で使用できます。

お役に立てれば。

こちらもご覧ください:

295
BalusC

ループ内で達成したい内容に応じて、代わりに次のいずれかを繰り返します。

  • countries.keySet()
  • countries.entrySet()
  • countries.values()
1
Jim Garrison