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> ```

Original source

Related problems