• Aucun résultat trouvé

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'un 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 contiendra le titre d'une news et 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<HashMap<String, String>> maListe = new ArrayList<HashMap<String, String>>();

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

Je sens que certains vont m'attendre au tournant... Eh oui, j'ai ici 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 salement 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 trouve les JSP s’appelle la couche de présentation.

Revenons à notre boucle : je n'ai ici 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é 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 titre et contenu de nos news, il suffit via des crochets de préciser les éléments visés dans notre map : ${news['titre']} et ${news['contenu']}. Les lignes contenant des éléments importants sont les lignes 16, 19 et 22 dans le code précédent.

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 ?

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. Je n'aborderai cependant volontairement 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 vous présenterai pas la bibliothèque sql de la JSTL, ne souhaitant pas vous voir effectuer des requêtes SQL depuis vos JSP !