Bonjour ! Dans la leçon précédente, nous avons vu comment gérer l'état d'un utilisateur avec les sessions HTTP. Vous avez probablement remarqué que générer du HTML directement depuis une servlet avec des out.println() est fastidieux, difficile à maintenir et mélange la logique métier avec la présentation. C'est une pratique que nous allons abandonner dès aujourd'hui.
Cette leçon introduit la solution moderne à ce problème : les JavaServer Pages (JSP). Nous verrons comment les JSP permettent de créer des vues pour nos applications web, en séparant clairement le code HTML de la logique Java. Pour rendre ces pages dynamiques, nous apprendrons à utiliser l'Expression Language (EL), une syntaxe simple et puissante pour afficher des données préparées par nos servlets. L'objectif est de vous rendre capable de créer des pages HTML qui affichent dynamiquement des informations (comme le nom d'un utilisateur connecté ou des détails sur un produit) sans écrire une seule ligne de code Java dans votre vue.
1. Pourquoi abandonner les out.println() ?
Avant de plonger dans la syntaxe des JSP, il est essentiel de bien comprendre le problème que nous résolvons. Le mélange de code Java et de balises HTML dans un même fichier est considéré comme une mauvaise pratique professionnelle depuis de nombreuses années. Cela rend le code illisible, difficile à déboguer et impossible à confier à un intégrateur web qui ne connaît pas Java.
La vidéo suivante introduit parfaitement cette problématique et présente l'Expression Language (EL) comme la solution pour nettoyer nos vues.
Développez des sites web avec Java EE: Utiliser Expression Language dans les JSP
Cette vidéo de la chaîne Cours informatique-G explique pourquoi le mélange de code Java et HTML dans les JSP (une pratique ancienne appelée "scriptlets") est une mauvaise idée et introduit l'Expression Language comme alternative propre.
Regardez l'introduction de la vidéo, de 0:00 à 1:12. Concentrez-vous sur l'argument principal : la complexité et la mauvaise maintenabilité du code mixte.
2. JSP et Expression Language : les bases
Une JSP (JavaServer Page) est, à première vue, un fichier HTML. Sa puissance réside dans sa capacité à inclure des balises spéciales qui sont interprétées par le serveur pour générer du contenu dynamique. Lorsque vous accédez à une JSP pour la première fois, votre conteneur de servlets (Tomcat) la compile en une servlet Java. C'est cette servlet qui est ensuite exécutée pour chaque requête.
L'Expression Language (EL) est le mécanisme que nous utiliserons pour insérer des données dynamiques dans la JSP. Sa syntaxe est très simple : tout ce qui se trouve entre ${ et } est une expression qui sera évaluée par le serveur.
Voyons à quel point c'est plus simple que d'écrire du Java.
Développez des sites web avec Java EE: Utiliser Expression Language dans les JSP
Continuons avec la même vidéo pour voir l'EL en action avec des exemples très simples.
Regardez la section suivante, de 1:12 à 2:59. Observez comment l'EL peut être utilisé pour effectuer des calculs simples (${6 * 3}) et, plus important encore, pour afficher la valeur d'une variable (${name}) qui aurait été transmise par une servlet.
3. Connecter la Servlet à la JSP : le modèle MVC
Le véritable flux de travail d'une application web Java professionnelle suit le patron de conception Modèle-Vue-Contrôleur (MVC).

Dans ce modèle :
- La Servlet (Contrôleur) reçoit la requête, traite la logique (par ex., vérifier un mot de passe, charger des produits depuis la base de données), puis stocke les résultats (le "modèle") comme attributs dans la requête ou la session.
- Au lieu de générer du HTML, la servlet transfère (forward) la requête à une JSP (Vue).
- La JSP utilise l'Expression Language (EL) pour lire les attributs de la requête/session et les afficher.
Comment l'EL accède-t-il aux données ?
Lorsque vous écrivez ${user.login}, l'EL effectue plusieurs actions intelligentes pour vous :
- Recherche de l'attribut : Il cherche un attribut nommé
userdans plusieurs "portées" (scopes), dans cet ordre :page,request,session, etapplication. Le premier qu'il trouve est utilisé. C'est pourquoi vous n'avez pas besoin de spécifierrequestScopeousessionScopela plupart du temps. - Appel du getter : Une fois l'objet
usertrouvé, l'EL ne tente pas d'accéder directement à la variablelogin. Au lieu de cela, il suit la convention JavaBean et appelle la méthodegetLogin(). C'est une simplification très puissante.
La vidéo suivante illustre parfaitement ce mécanisme avec un objet connectedUser stocké en session.
TUTO Java EE - Utilisation des API EL (Expression Language) et JSTL (Java Standard Tag Library)
Cette vidéo de Dominique Liard montre un exemple concret d'utilisation de l'EL pour afficher des données d'un objet stocké en session, en expliquant le mécanisme d'appel des getters.
Regardez la partie accès aux données de session. Portez une attention particulière à la façon dont ${connectedUser.login} est lié à la méthode getLogin() de la classe User et comment l'EL cherche l'attribut dans les différentes portées (request, session, etc.).
4. Le guide de référence de l'Expression Language
L'EL est riche en fonctionnalités. Pour bien les maîtriser, il est utile d'avoir une ressource de référence. Le document suivant résume les concepts clés.
JSP : Java Server Pages - David Gayerie
Cette page du site de David Gayerie est un excellent mémento sur les JSP et l'EL. Elle synthétise les points essentiels que nous abordons.
Lisez les sections suivantes pour consolider votre compréhension : EL : Expression Language : pour revoir la syntaxe de base et l'accès aux propriétés des objets. Les opérateurs dans l’expression language : pour voir la liste des opérateurs arithmétiques, logiques et de comparaison. Les objets implicites dans une JSP : pour découvrir les objets utiles comme param (pour les paramètres d'URL) et cookie. La résolution de portée des attributs : pour bien comprendre comment l'EL cherche les attributs.
5. Fonctionnalités avancées et bonnes pratiques de l'EL
Logique conditionnelle simple
L'EL n'est pas un langage de programmation complet, mais il permet une logique de présentation simple. L'opérateur empty et l'opérateur ternaire ? : sont particulièrement utiles.
empty variablerenvoietruesivariableestnull, une chaîne vide, ou une collection/map vide.condition ? valeur_si_vrai : valeur_si_fauxpermet un affichage conditionnel.
Voyons comment les combiner pour, par exemple, afficher un nom d'utilisateur s'il existe, et ne rien afficher sinon.
Développez des sites web avec Java EE: Utiliser Expression Language dans les JSP
Retournons à la première vidéo pour voir une démonstration pratique de l'opérateur empty et de l'opérateur ternaire.
Regardez la section sur la logique conditionnelle. Cet exemple montre comment éviter d'afficher "null" à l'écran, un cas très courant en développement web.
Gestion robuste des erreurs
Un des plus grands avantages de l'EL est sa gestion des valeurs null. En Java, si vous faites user.getAddress().getCity() et que getAddress() renvoie null, votre application plante avec une NullPointerException. En EL, si vous écrivez ${user.address.city}, l'expression renverra simplement une chaîne vide. C'est un comportement beaucoup plus robuste pour une couche de présentation.
Le document suivant explique très bien cette caractéristique essentielle.
Les Expressions Languages - Developpez.com
Cet article de Developpez.com détaille le fonctionnement interne de l'EL, et cette section spécifique est très pertinente pour comprendre les bonnes pratiques.
Lisez la section 1-8. Gestion des exceptions. Elle explique comment l'EL gère les NullPointerException et les ArrayOutOfBoundException pour vous, ce qui simplifie énormément le code de la vue.
6. Application pratique : refactoriser notre système de connexion
Appliquons ce que nous avons appris en refactorisant la LoginServlet de la leçon précédente pour utiliser une JSP.
Ancien code dans doGet (mauvaise pratique) :
// ...
if (session != null && session.getAttribute("username") != null) {
String username = (String) session.getAttribute("username");
out.println("<h1>Bienvenue, " + username + "!</h1>");
out.println("<a href='logout'>Se déconnecter</a>");
} else {
response.sendRedirect("login.html");
}
Nouveau code dans doGet (bonne pratique MVC) :
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
HttpSession session = request.getSession(false);
if (session != null && session.getAttribute("username") != null) {
// On ne génère plus de HTML ici.
// On transfère simplement la requête à la JSP.
request.getRequestDispatcher("/WEB-INF/dashboard.jsp").forward(request, response);
} else {
response.sendRedirect("login.html");
}
}
Points clés :
getRequestDispatcher(...)obtient un objet pour transférer la requête à une autre ressource sur le serveur (notre JSP).forward(request, response)transfère la requête et la réponse à la JSP. Les attributs que vous avez définis dansrequestetsessionsont conservés. C'est une opération interne au serveur, l'URL dans le navigateur du client ne change pas.- Sécurité : En plaçant les JSP dans le dossier
/WEB-INF/, elles ne sont pas accessibles directement par l'utilisateur via une URL, mais seulement via unforwarddepuis une servlet. C'est une bonne pratique de sécurité.
Le fichier /WEB-INF/dashboard.jsp :
<%@ page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<title>Tableau de bord</title>
</head>
<body>
<h1>Bienvenue, ${sessionScope.username}!</h1>
<p>Ceci est votre tableau de bord personnel.</p>
<p><a href="logout">Se déconnecter</a></p>
</body>
</html>
Points clés :
<%@ page ... %>est une directive JSP.pageEncoding="UTF-8"est crucial pour la gestion des accents.${sessionScope.username}accède directement à l'attributusernameque nous avons stocké dans la session. Le code est propre, lisible et purement déclaratif.
Exercice
Il est temps de mettre cela en pratique. Vous allez créer une page qui affiche les détails d'un produit.
- Créez une classe JavaBean
Produit.javaavec des attributs privésnom(String) etprix(double), ainsi que les getters publics correspondants (getNom()etgetPrix()). - Créez une servlet
ProduitServlet.javaqui, dans sa méthodedoGet, fait ce qui suit :- Crée une instance de votre classe
Produit. Par exemple :Produit produit = new Produit("Souris Gamer", 49.99); - Stocke cet objet dans la portée de la requête :
request.setAttribute("produitAffiche", produit); - Transfère la requête à une JSP :
request.getRequestDispatcher("/WEB-INF/detailsProduit.jsp").forward(request, response);
- Crée une instance de votre classe
- Créez la page JSP
/WEB-INF/detailsProduit.jsp:- Assurez-vous d'inclure la directive
<%@ page pageEncoding="UTF-8" ... %>. - Dans le corps de la page, utilisez l'Expression Language pour afficher le nom et le prix du produit.
- Le rendu final devrait ressembler à :
<h1>Détails du produit</h1> <p>Nom : Souris Gamer</p> <p>Prix : 49.99 €</p> - (Bonus) Utilisez l'opérateur
emptypour afficher un message "Produit non disponible" si l'attributproduitAfficheestnull.
- Assurez-vous d'inclure la directive
Cet exercice vous permettra de maîtriser le flux complet : création d'un modèle (JavaBean), préparation des données dans le contrôleur (Servlet) et affichage dans la vue (JSP avec EL).
Conclusion
Félicitations ! Vous venez de franchir une étape majeure pour devenir un développeur backend Java professionnel. Vous savez maintenant comment séparer la logique de la présentation, un principe fondamental d'une architecture logicielle saine.
Les points clés à retenir :
- Les JSP servent de vues dans l'architecture MVC, se concentrant sur la présentation (HTML).
- L'Expression Language (EL), avec sa syntaxe
${...}, est le moyen propre et moderne d'insérer des données dynamiques dans une JSP. - L'EL accède aux attributs des portées (
request,session...) et appelle implicitement les getters des JavaBeans (${produit.nom}appellegetNom()). - Le flux standard est : la Servlet (contrôleur) prépare les données et les transfère (
forward) à la JSP (vue) pour l'affichage. - L'EL gère les valeurs
nullde manière robuste, évitant lesNullPointerExceptiondans la vue.
Dans la leçon d'aujourd'hui, nous n'avons affiché qu'un seul objet. Mais que faire si notre servlet prépare une liste de produits ? Comment faire une boucle en JSP ? C'est le sujet de notre prochaine leçon, où nous découvrirons la JSTL (JSP Standard Tag Library) et ses balises très utiles comme <c:forEach> et <c:if>.