• Aucun résultat trouvé

Itération sur une collection

Dans le document Cours J2EE Approfondi (Page 138-140)

Passons maintenant à quelque chose de plus intéressant et utilisé dans la création de pages web : les itérations sur les

collections. Si ce terme ne vous parle pas, c'est que vous avez besoin d'une bonne piqûre de rappel en Java ! Et ce n'est pas moi

qui vous la donnerai, si vous en sentez le besoin, allez faire un tour sur ce chapitre du tuto de Java.

La syntaxe utilisée pour parcourir une collection est similaire à celle d'une boucle simple, sauf que cette fois, un attribut items est requis. Et pour cause, c'est lui qui indiquera la collection à parcourir. Imaginons ici que nous souhaitions réaliser l'affichage de news sur une page web. Imaginons pour cela que nous ayons à disposition un ArrayList ici nommé maListe, contenant simplement des HashMap. Chaque HashMap ici associera le titre d'une news à son contenu. Nous souhaitons alors parcourir cette liste afin d'afficher ces informations dans une page web :

Code : JSP

<%@ page import="java.util.*" %> <%

/* Création de la liste et des données */

List<Map<String, String>> maListe = new ArrayList<Map<String,

String>>();

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

news.put("titre", "Titre de ma première news");

news.put("contenu", "corps de ma première news");

maListe.add(news);

news = new HashMap<String, String>();

news.put("titre", "Titre de ma seconde news");

news.put("contenu", "corps de ma seconde news");

maListe.add(news);

pageContext.setAttribute("maListe", maListe);

%>

<c:forEach items="${maListe}" var="news"> <div class="news"> <div class="titreNews"> <c:out value="${news['titre']}" /> </div> <div class="corpsNews"> <c:out value="${news['contenu']}" /> </div> </div>

</c:forEach>

Je sens que certains vont m'attendre au tournant... Eh oui, j'ai utilisé du code Java ! Et du code sale en plus ! Mais attention à ne pas vous y méprendre : je n'ai recours à du code Java ici que pour l'exemple, afin de vous procurer un moyen simple et rapide pour initialiser des données de test, et afin de vérifier le bon fonctionnement de notre boucle.

Il va de soi que dans une vraie application web, ces données seront initialisées correctement, et non pas comme je l'ai fait ici. Qu'elles soient récupérées depuis une base de données, depuis un fichier, voire codées en dur dans la couche métier de votre application, ces données ne doivent jamais et en aucun cas, je répète, elles ne doivent jamais et en aucun cas, être initialisées directement depuis vos JSP ! Le rôle d'une page JSP, je le rappelle, c'est de présenter l'information, un point c'est tout. Ce n'est pas pour rien que la couche dans laquelle se trouvent les JSP s’appelle la couche de présentation.

Revenons à notre boucle : ici, je n'ai pas encombré la syntaxe, en utilisant les seuls attributs items et var. Le premier indique la collection sur laquelle la boucle porte, en l'occurrence notre List nommée maListe, et le second indique quant à lui le nom de la variable qui sera liée à l’élément courant de la collection parcourue par la boucle, que j'ai ici de manière très originale nommée "news", nos HashMap contenant... des news. Ainsi, pour accéder respectivement aux titres et contenus de nos news, il suffit, via la notation avec crochets, de préciser les éléments visés dans notre Map, ici aux lignes 19 et 22. Nous aurions très bien pu utiliser à la place des crochets l'opérateur point : ${news.titre} et ${news.contenu}.

Voici le rendu HTML de cet exemple :

Code : HTML

<div class="news">

<div class="titreNews">

Titre de ma première news </div>

<div class="corpsNews">

corps de ma première news </div>

</div>

<div class="news">

<div class="titreNews">

Titre de ma seconde news </div>

<div class="corpsNews">

corps de ma seconde news </div>

</div>

Les attributs présentés précédemment lors de l'étude d'une boucle simple sont là aussi valables : si vous souhaitez par exemple n'afficher que les dix premières news sur votre page, vous pouvez limiter le parcours de votre liste aux dix premiers éléments ainsi :

Code : JSP

<c:forEach items="${maListe}" var="news" begin="0" end="9">

...

</c:forEach>

Si les attributs begin et end spécifiés dépassent le contenu réel de la collection, par exemple si vous voulez afficher les dix premiers éléments d'une liste mais qu'elle n'en contient que trois, la boucle s'arrêtera automatiquement lorsque le parcours de la liste sera terminé, peu importe l'indice end spécifié.

Simple, n'est-ce pas ?

À titre d'information, voici enfin les différentes collections sur lesquelles il est possible d'itérer avec la boucle <c:forEach>

de la bibliothèque Core :

java.util.Collection ; java.util.Map ;

java.util.Iterator ; java.util.Enumeration ; Array d'objets ou de types primitifs ;

(Chaînes de caractères séparées par des séparateurs définis).

Si j'ai mis entre parenthèses le dernier élément, c'est parce qu'il est déconseillé d'utiliser cette boucle pour parcourir une chaîne de caractères dont les éléments sont séparés par des caractères séparateurs définis. Voyez le paragraphe suivant pour en savoir plus à ce sujet.

Enfin, sachez qu'il est également possible d'itérer directement sur le résultat d'une requête SQL. Cependant, volontairement, je n'aborderai pas ce cas, pour deux raisons :

je ne vous ai pas encore présenté la bibliothèque sql de la JSTL, permettant d'effectuer des requêtes SQL depuis vos JSP ;

je ne vous présenterai pas la bibliothèque sql de la JSTL, ne souhaitant pas vous voir effectuer des requêtes SQL depuis vos JSP !

Dans le document Cours J2EE Approfondi (Page 138-140)