JSPでHashMap
をループするにはどうすればよいですか?
<%
HashMap<String, String> countries = MainUtils.getCountries(l);
%>
<select name="country">
<%
// Here I need to loop through countries.
%>
</select>
通常の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>
タグがあり、他のMap
sを反復処理できます。繰り返しごとに 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
が必要です。このリストがリクエストベースであることになっている場合、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()
を使用して、1回だけロードされ、メモリに保持されるようにします。
public void contextInitialized(ServletContextEvent event) {
Map<String, String> countries = MainUtils.getCountries();
event.getServletContext().setAttribute("countries", countries);
}
どちらの場合も、countries
は、${countries}
によって EL で使用できます。
お役に立てれば。
ループ内で達成したい内容に応じて、代わりに次のいずれかを繰り返します。
countries.keySet()
countries.entrySet()
countries.values()