Skip to main content

Welcome to a Grasp lesson

Create a free account to keep studying and create your own study path.

Lesson 54

JSTL: Boucles et conditions en JSP

Recommended resources

Bonjour ! Dans la leçon précédente, nous avons fait un grand pas en avant en apprenant à utiliser les JSP et l'Expression Language (EL) pour créer des vues dynamiques. Vous savez maintenant comment afficher proprement des données uniques transmises par une servlet, comme le nom d'un utilisateur connecté, sans mélanger code Java et HTML.

Cependant, une question reste en suspens : comment gérer des logiques de présentation plus complexes ? Que faire si votre servlet envoie une liste de produits ? Comment afficher une section HTML uniquement si une certaine condition est remplie ? L'EL seul ne suffit pas pour gérer les boucles et les conditions complexes. La solution professionnelle à ce problème est la JSTL (JSP Standard Tag Library).

Aujourd'hui, nous allons nous plonger dans la JSTL. Vous apprendrez à utiliser ses balises pour implémenter des boucles et des structures conditionnelles directement dans vos fichiers JSP. À la fin de cette leçon, vous serez capable de générer des listes de données et de contrôler l'affichage de votre page de manière dynamique et élégante, complétant ainsi votre boîte à outils pour la couche de présentation de vos applications web.

1. Qu'est-ce que la JSTL et comment l'installer ?

La JSTL est une collection de bibliothèques de balises personnalisées qui étendent les fonctionnalités des JSP. Elle fournit des balises pour des tâches courantes qui, autrement, nécessiteraient l'utilisation de code Java (les scriptlets <% ... %>, que nous voulons absolument éviter). La bibliothèque la plus importante et la plus utilisée est la bibliothèque Core, qui contient les balises pour la logique (conditions, boucles) et la manipulation de variables.

Étant une bibliothèque standard mais externe, la JSTL doit être ajoutée à notre projet en tant que dépendance Maven.

Dans votre fichier pom.xml, vous devez ajouter les deux dépendances suivantes :

<!-- API JSTL pour Jakarta EE -->
<dependency>
    <groupId>jakarta.servlet.jsp.jstl</groupId>
    <artifactId>jakarta.servlet.jsp.jstl-api</artifactId>
    <version>3.0.0</version>
</dependency>

<!-- Implémentation de la JSTL (par GlassFish) -->
<dependency>
    <groupId>org.glassfish.web</groupId>
    <artifactId>jakarta.servlet.jsp.jstl</artifactId>
    <version>3.0.1</version>
</dependency>

Une fois la dépendance ajoutée, vous devez déclarer l'utilisation de la bibliothèque de balises au début de chaque fichier JSP où vous souhaitez l'utiliser. Pour la bibliothèque Core, la directive est la suivante :

<%@ taglib prefix="c" uri="jakarta.tags.core" %>
  • prefix="c" : C'est le préfixe que nous utiliserons pour toutes les balises de la bibliothèque Core (par exemple, <c:if>). C'est une convention très forte, respectez-la.
  • uri="jakarta.tags.core" : C'est l'identifiant unique de la bibliothèque que nous utilisons. Il correspond à la version moderne de la JSTL pour Jakarta EE (utilisée par Tomcat 10 et plus).

2. Affichage conditionnel avec <c:if> et <c:choose>

La JSTL rend la logique conditionnelle dans une JSP simple et lisible.

La condition simple : <c:if>

La balise <c:if> permet d'inclure un bloc de contenu HTML uniquement si une condition est vraie. Son attribut test attend une expression EL qui doit être évaluée à true.

Attention : <c:if> ne possède pas d'équivalent else.

La vidéo suivante montre un exemple très pratique : ajouter la lettre "s" au mot "article" seulement si le nombre d'articles est supérieur à 1.

TUTO Java EE - Utilisation des API EL (Expression Language) et JSTL (Java Standard Tag Library)

Cette vidéo de Dominique Liard illustre parfaitement l'utilisation de <c:if> pour une logique d'affichage simple et courante.

Regardez la section sur la condition JSTL. Observez comment la balise <c:if> et une expression EL sont combinées pour résoudre un problème de grammaire simple mais très fréquent dans les interfaces. Notez bien la déclaration taglib au début.

Voici un autre exemple typique : afficher un lien de déconnexion uniquement si l'utilisateur est connecté (c'est-à-dire si l'attribut username existe dans la session).

<c:if test="${not empty sessionScope.username}">
    <p>
        Bienvenue, ${sessionScope.username} ! 
        <a href="logout">Se déconnecter</a>
    </p>
</c:if>

Ici, l'opérateur not empty de l'EL est très pratique.

Les conditions multiples : <c:choose>, <c:when>, <c:otherwise>

Pour gérer des cas de type if-else if-else ou switch, la JSTL fournit une structure plus complète :

  • <c:choose> : La balise parente qui encapsule toute la logique.
  • <c:when test="..."> : Équivaut à un if ou else if. Il peut y en avoir plusieurs. Le premier dont le test est true sera exécuté.
  • <c:otherwise> : Équivaut au else final (ou default dans un switch). Il est optionnel et il ne peut y en avoir qu'un seul, à la fin.

Exemple : Afficher un message différent selon le rôle d'un utilisateur.

<c:choose>
    <c:when test="${user.role == 'ADMIN'}">
        <p>Bonjour Administrateur. <a href="/admin">Panneau d'administration</a></p>
    </c:when>
    <c:when test="${user.role == 'USER'}">
        <p>Bienvenue sur votre espace client.</p>
    </c:when>
    <c:otherwise>
        <p>Bonjour invité. <a href="login">Connectez-vous</a> pour accéder à plus de fonctionnalités.</p>
    </c:otherwise>
</c:choose>

3. Les boucles avec <c:forEach>

C'est sans doute la balise la plus puissante et la plus utilisée de la JSTL. Elle permet d'itérer sur des collections de données (comme une liste de produits) pour générer dynamiquement du contenu HTML.

Itérer sur une collection

La syntaxe de base pour parcourir une collection est la suivante :
<c:forEach items="${collection}" var="element">

  • items : Une expression EL qui pointe vers votre collection (List, Set, Map, tableau...). C'est la liste de données que votre servlet a placée dans la portée request ou session.
  • var : Le nom que vous donnez à la variable qui représentera l'élément courant à chaque tour de boucle.

La vidéo suivante explique très clairement comment parcourir un simple tableau de chaînes de caractères.

Développez des sites web avec Java EE: JSTL et Boucles

Cette vidéo de la chaîne Cours informatique-G est une excellente introduction pédagogique à la balise <c:forEach>.

Regardez la section parcourir un tableau. Concentrez-vous sur la manière dont la servlet prépare un tableau, le place dans la requête avec setAttribute, et comment la JSP le récupère avec l'attribut items de <c:forEach>.

Maintenant, voyons un exemple plus complexe et réaliste : construire un tableau HTML à partir d'une liste d'objets.

TUTO Java EE - Utilisation des API EL (Expression Language) et JSTL (Java Standard Tag Library)

Revenons à la vidéo de Dominique Liard pour un cas d'usage plus avancé : la construction d'un panier d'achats.

Regardez la section sur la boucle forEach. Cet exemple est parfait car il montre comment générer des lignes de tableau (<tr>) dynamiquement. Observez bien comment, à l'intérieur de la boucle, l'EL est utilisé sur la variable line (définie dans l'attribut var) pour accéder aux propriétés de chaque objet : ${line.article.description}, ${line.quantity}, etc.

Informations sur l'itération avec varStatus

Parfois, il est utile de savoir où l'on en est dans la boucle (est-ce le premier élément ? le dernier ? quel est l'index ?). L'attribut varStatus permet de créer un objet qui contient ces informations.

<c:forEach items="${produits}" var="p" varStatus="status">
    <tr class="${status.index % 2 == 0 ? 'ligne-paire' : 'ligne-impaire'}">
        <td>${status.count}</td>
        <td>${p.nom}</td>
        <td>${p.prix}</td>
    </tr>
</c:forEach>

Propriétés utiles de varStatus :

  • status.index : L'index de l'itération courante (commence à 0).
  • status.count : Le numéro de l'itération courante (commence à 1).
  • status.first : true s'il s'agit de la première itération.
  • status.last : true s'il s'agit de la dernière itération.

La vidéo suivante vous montrera comment utiliser varStatus.

Développez des sites web avec Java EE: JSTL et Boucles

Cette section de la vidéo de Cours informatique-G explique l'utilité de l'attribut varStatus.

Regardez la partie sur le statut de la boucle. L'exemple avec status.count pour numéroter les éléments est très parlant.


Mémento JSTL Core

Pour vous aider à mémoriser ces balises, voici un mémento visuel qui résume les éléments clés de la JSTL que nous avons vus aujourd'hui.

Ce mémento est une référence rapide pour la syntaxe des directives JSP, de l'EL, et des balises JSTL Core comme `c:if`, `c:choose` et `c:forEach`. Gardez-le à portée de main lorsque vous développerez vos vues.

Exercice pratique

Il est temps de mettre tout cela en application. Nous allons améliorer l'exercice de la leçon précédente pour afficher une liste de produits.

  1. Modifier la ProduitServlet.java :

    • Au lieu de créer un seul produit, créez une List<Produit>.
    • Ajoutez au moins 3 instances de Produit à cette liste, avec des noms et des prix différents.
    • Stockez la liste entière dans la portée de la requête. Changez le nom de l'attribut au pluriel pour plus de clarté : request.setAttribute("produits", listeDeProduits);
    • Faites suivre la requête à une nouvelle JSP : request.getRequestDispatcher("/WEB-INF/listeProduits.jsp").forward(request, response);
  2. Créer la page /WEB-INF/listeProduits.jsp :

    • N'oubliez pas la directive taglib pour la JSTL Core en haut du fichier.
    • Créez une structure de tableau HTML (<table>, <thead>, <tbody>).
    • Dans <thead>, définissez les en-têtes des colonnes : "N°", "Nom", "Prix", "Remarque".
    • Dans <tbody>, utilisez <c:forEach> pour itérer sur la liste de produits (${produits}).
    • Pour chaque produit, créez une ligne de tableau <tr> avec les cellules <td> correspondantes :
      • Utilisez varStatus pour afficher le numéro de la ligne (${status.count}).
      • Affichez le nom (${produit.nom}) et le prix (${produit.prix}).
      • Bonus : Dans la colonne "Remarque", utilisez <c:if> pour afficher le message "Bonne affaire !" si le prix du produit est inférieur à 20 €.

Le résultat final devrait être un tableau HTML affichant la liste de tous vos produits.


Conclusion

Félicitations ! Vous maîtrisez maintenant les outils essentiels pour construire la couche de présentation d'une application web Java de manière professionnelle. En combinant Servlets, JSP, Expression Language et JSTL, vous êtes capable de créer des interfaces web dynamiques, maintenables et qui respectent le patron de conception MVC.

Les points clés à retenir :

  • La JSTL est la solution standard pour ajouter de la logique (boucles, conditions) à vos JSP sans utiliser de code Java.
  • L'installation se fait via une dépendance Maven et la déclaration <%@ taglib ... %> dans la JSP.
  • <c:if> et <c:choose> / <c:when> / <c:otherwise> permettent de gérer les affichages conditionnels.
  • <c:forEach> est la balise indispensable pour itérer sur des collections de données et générer du contenu répétitif (listes, tableaux...).
  • L'attribut varStatus fournit des informations précieuses sur l'état de la boucle en cours.

Nous avons maintenant exploré en détail le Contrôleur (Servlet) et la Vue (JSP). Dans la prochaine leçon, nous allons consolider l'ensemble du flux MVC en connectant notre couche de présentation à la couche d'accès aux données (DAO) que vous avez déjà implémentée avec JDBC. Vous apprendrez à afficher dans vos pages web des données provenant réellement d'une base de données.