How to loop through a HashMap in JSP?

前端 未结 3 1251
长发绾君心
长发绾君心 2020-11-22 02:18

How can I loop through a HashMap in JSP?

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


                        
    
提交评论

  • 2020-11-22 02:31

    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 (just drop the JAR file in /WEB-INF/lib and declare the needed taglibs in top of JSP). It has a <c:forEach> tag which can iterate over among others Maps. 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="http://java.sun.com/jsp/jstl/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="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>
    

    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}.

    Hope this helps.

    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
    0 讨论(0)
  • 2020-11-22 02:42

    Depending on what you want to accomplish within the loop, iterate over one of these instead:

    • countries.keySet()
    • countries.entrySet()
    • countries.values()
    0 讨论(0)
  • 提交回复
    热议问题