How to loop through a HashMap in JSP?
hashmap, java, jsp, loops
Solution
Just the same way as you would do in normal Java code.
for (Map.Entry<String, String> entry : countries.entrySet()) {
String key = entry.getKey();
String value = entry.getValue();
// ...
}
However, scriptlets (raw Java code in JSP files, those `<% %>` things) are considered a poor practice. I recommend to install JSTL. It has a `<c:forEach>` tag which can iterate over among others `Map`s. Every iteration will give you a `Map.Entry` back which in turn has `getKey()` and `getValue()` methods.
Here's a basic example:
<%@ taglib prefix="c" uri="jakarta.tags.core" %>
<c:forEach items="${map}" var="entry">
Key = ${entry.key}, value = ${entry.value}<br>
</c:forEach>
Thus your particular issue can be solved as follows:
<%@ taglib prefix="c" uri="jakarta.tags.core" %>
<select name="country">
<c:forEach items="${countries}" var="country">
<option value="${country.key}">${country.value}</option>
</c:forEach>
</select>
You need a `Servlet` or a `ServletContextListener` to place the `${countries}` in the desired scope. If this list is supposed to be request-based, then use the `Servlet`'s `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);
}
Or if this list is supposed to be an application-wide constant, then use `ServletContextListener`'s `contextInitialized()` so that it will be loaded only once and kept in memory:
public void contextInitialized(ServletContextEvent event) {
Map<String, String> countries = MainUtils.getCountries();
event.getServletContext().setAttribute("countries", countries);
}
In both cases the `countries` will be available in EL by `${countries}`.
See also:
- Iterate over elements of List and Map using JSTL <c:forEach> tag
- How to iterate over a nested map in <c:forEach>
- How to iterate an ArrayList inside a HashMap using JSTL?
- Using special auto start servlet to initialize on startup and share application data
Problem
How can I loop through a `HashMap` in JSP? ``` <% HashMap<String, String> countries = MainUtils.getCountries(l); %> <select name="country"> <% // Here I need to loop through countries. %> </select> ```
Related problems
- How to iterate an ArrayList inside a HashMap using JSTL?
- Iterate over elements of List and Map using JSTL <c:forEach> tag
- How can I avoid Java code in JSP files, using JSP 2?
- Using special auto start servlet to initialize on startup and share application data
- How to iterate over a nested map in <c:forEach>