Come eseguire il loop attraverso una HashMap in JSP?


146

Come posso eseguire il loop in a HashMapin JSP?

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

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

17
A proposito, a HashMapè per natura non ordinato. Sei sicuro di non aver bisogno TreeMap(automagic ordina per chiave) o LinkedHashMap(mantiene l'ordine di inserimento)?
BalusC,

Risposte:


308

Proprio come faresti nel normale codice Java.

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

Tuttavia , gli scriptlet (codice Java non elaborato nei file JSP, quelle <% %>cose) sono considerati una cattiva pratica . Consiglio di installare JSTL (basta rilasciare il file JAR /WEB-INF/libe dichiarare i taglibs necessari nella parte superiore di JSP). Ha un <c:forEach>tag che può scorrere tra gli altri Map. Ogni iterazione ti darà una Map.Entryschiena che a sua volta ha getKey()e getValue()metodi.

Ecco un esempio di base:

<%@ 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>

Pertanto, il problema specifico può essere risolto come segue:

<%@ 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>

È necessario a Servleto a ServletContextListenerper posizionare l' ${countries}ambito desiderato. Se questo elenco si suppone che sia richiesta-based, quindi utilizzare il 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);
}

Oppure, se si suppone che questo elenco sia una costante a livello di applicazione, utilizzare ServletContextListener's in contextInitialized()modo che venga caricato solo una volta e conservato in memoria:

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

In entrambi i casi countriessarà disponibile in EL da ${countries}.

Spero che questo ti aiuti.

Guarda anche:


2
@Khue: sì, puoi anche inserire attributi nella sessione. Non vedo solo perché vorresti duplicare i dati a livello di applicazione su più sessioni.
BalusC,

Penso in caso di informazioni basate sulla sessione. Grazie per la bella spiegazione.
Khue Vu,

Sono sicuro che la risposta sia ovvia ma: perché gli scriptlet sono considerati una cattiva pratica? In assenza di JSTL a causa del mantenimento di un'applicazione legacy, questa è la mia unica opzione.
Zibbobz,

@Zibbobz: il testo "cattiva pratica" è un collegamento. Cliccaci sopra.
BalusC

1

A seconda di ciò che si desidera ottenere all'interno del ciclo, scorrere invece su uno di questi:

  • countries.keySet()
  • countries.entrySet()
  • countries.values()

sì, con questo ottengo tutte le chiavi impostate ma come posso integrarlo in un campo selezionato per HTML?
blub

6
questo non risponde alla domanda specifica su JSP
Taoufik Mohdit,

0

Di seguito il codice funziona per me

per prima cosa ho definito partnerTypesMapcome sotto nel lato server,

Map<String, String> partnerTypes = new HashMap<>();

dopo aver aggiunto dei valori ad esso ho aggiunto l'oggetto a model,

model.addAttribute("partnerTypesMap", partnerTypes);

Quando eseguo il rendering della pagina che uso di seguito foreachper stamparli uno per uno.

<c:forEach items="${partnerTypesMap}" var="partnerTypesMap">
      <form:option value="${partnerTypesMap['value']}">${partnerTypesMap['key']}</form:option>
</c:forEach>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.