Comment puis-je faire une boucle dans un HashMap
en JSP ?
<%
HashMap<String, String> countries = MainUtils.getCountries(l);
%>
<select name="country">
<%
// Here I need to loop through countries.
%>
</select>
Comment puis-je faire une boucle dans un HashMap
en JSP ?
<%
HashMap<String, String> countries = MainUtils.getCountries(l);
%>
<select name="country">
<%
// Here I need to loop through countries.
%>
</select>
De la même manière que vous le feriez dans un code Java normal.
for (Map.Entry<String, String> entry : countries.entrySet()) {
String key = entry.getKey();
String value = entry.getValue();
// ...
}
Cependant , scriptlets (code Java brut dans les fichiers JSP, ces <% %>
choses) sont considérées comme un mauvaise pratique . Je recommande d'installer JSTL (il suffit de déposer le fichier JAR dans /WEB-INF/lib
et déclarer les taglibs au dessus de JSP). Il possède un <c:forEach>
qui peut itérer sur entre autres Map
s. Chaque itération vous donnera un Map.Entry
qui, à son tour, a getKey()
y getValue()
méthodes.
Voici un exemple de 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>
Votre problème particulier peut donc être résolu comme suit :
<%@ 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>
Vous avez besoin d'un Servlet
ou un ServletContextListener
pour placer le ${countries}
dans la portée souhaitée. Si cette liste est censée être basée sur des requêtes, utilisez alors l'option 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);
}
Ou si cette liste est censée être une constante pour toute l'application, alors utilisez ServletContextListener
's contextInitialized()
afin qu'il ne soit chargé qu'une seule fois et conservé en mémoire :
public void contextInitialized(ServletContextEvent event) {
Map<String, String> countries = MainUtils.getCountries();
event.getServletContext().setAttribute("countries", countries);
}
Dans les deux cas, le countries
sera disponible en EL por ${countries}
.
J'espère que cela vous aidera.
@Khue : oui, vous pouvez aussi mettre des attributs dans la session. Seulement, je ne vois pas pourquoi vous voudriez dupliquer les données de l'application sur plusieurs sessions.
Je pense que dans le cas d'informations basées sur la session. Merci pour cette très belle explication.
Je suis sûr que la réponse est évidente, mais pourquoi les scriptlets sont-ils considérés comme une mauvaise pratique ? En l'absence de JSTL en raison de la maintenance d'une ancienne application, c'est ma seule option.
Le code ci-dessous fonctionne pour moi
J'ai d'abord défini le partnerTypesMap
comme ci-dessous du côté serveur,
Map<String, String> partnerTypes = new HashMap<>();
après lui avoir ajouté des valeurs, j'ai ajouté l'objet à model
,
model.addAttribute("partnerTypesMap", partnerTypes);
Lors du rendu de la page, j'utilise les éléments suivants foreach
pour les imprimer un par un.
<c:forEach items="${partnerTypesMap}" var="partnerTypesMap">
<form:option value="${partnerTypesMap['value']}">${partnerTypesMap['key']}</form:option>
</c:forEach>
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
18 votes
Au fait, un
HashMap
est par nature non ordonnée. Etes-vous certain que vous n'avez pas besoinTreeMap
(tri automatique par clé) ouLinkedHashMap
(maintient l'ordre d'insertion) ?