Adieu le code spaghetti : comment éliminer définitivement le Java de vos JSP
\n\nSi vous avez déjà ouvert un vieux fichier JSP et découvert un mélange de HTML, de scriptlets <% %> et de logique Java, vous savez de quoi je parle. Ce mélange de présentation et de logique métier transforme la maintenance d'un projet en véritable cauchemar. La question "How can I avoid Java code in JSP files, using JSP 2?" a été vue des milliers de fois sur Stack Overflow — et pour cause.
Bonne nouvelle : JSP 2 (Java Server Pages version 2) nous offre les outils pour oublier définitivement les scriptlets. Dans cet article, je vais vous présenter trois approches concrètes qui transformeront vos JSP en templates propres et lisibles. Du concret, rien que du code et de la pratique.
\n\nPourquoi les scriptlets sont-ils nuisibles ? Le point de vue du développeur
\n\nLes scriptlets (ces fameux <% ... %>) violent le principe fondamental du MVC : la séparation de la logique et de la présentation. Voici trois raisons de les abandonner :
- \n
- Maintenance complexe. Quand une JSP contient des requêtes SQL et des conditions, un designer ne peut pas modifier la mise en page en toute sécurité. \n
- Tests difficiles. La logique intégrée dans une JSP ne peut pas être testée avec des tests unitaires. \n
- Lisibilité médiocre. Le code devient un "spaghetti" où le Java se mêle au HTML. \n
JSP 2 propose des alternatives élégantes. Prenons un exemple concret : afficher une liste d'utilisateurs depuis une base de données.
\n\nApproche 1 : Expression Language (EL) — votre nouvel allié
\n\nL'Expression Language (EL) permet d'accéder aux objets Java directement dans une JSP, sans une seule ligne de code Java. La syntaxe ${...} est intuitive.
Avant (avec du code Java) :
\n\n<% \n User user = (User) request.getAttribute("user"); \n out.println("Bonjour, " + user.getName());\n%>\n\nAprès (avec EL) :
\n\n<p>Bonjour, ${user.name}</p>\n\nEL appelle automatiquement les getters. Si user.getName() retourne une chaîne, elle sera insérée dans le HTML. Si l'objet est null, EL n'affiche tout simplement rien (pas de NullPointerException).
Quand l'utiliser : pour afficher des données provenant des scopes request, session, application ou des paramètres de requête.
\n\nApproche 2 : JSTL (JSP Standard Tag Library) — boucles et conditions sans Java
\n\nJSTL est un ensemble de tags prêts à l'emploi qui couvrent 90 % des tâches courantes : boucles, conditions, formatage, gestion des URL. Pour l'utiliser, ajoutez simplement la dépendance dans votre pom.xml (Maven) ou téléchargez le JAR.
Exemple : afficher une liste d'utilisateurs dans un tableau.
\n\nAvant (scriptlets) :
\n\n<table>\n <%\n List<User> users = (List<User>) request.getAttribute("users");\n for (User u : users) {\n %>\n <tr><td><%= u.getName() %></td><td><%= u.getEmail() %></td></tr>\n <%\n }\n %>\n</table>\n\nAprès (JSTL + EL) :
\n\n<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>\n<table>\n <c:forEach var="u" items="${users}">\n <tr>\n <td>${u.name}</td>\n <td>${u.email}</td>\n </tr>\n </c:forEach>\n</table>\n\nRemarquez : pas une seule ligne de Java ! La balise <c:forEach> fonctionne comme une boucle foreach, et ${u.name} est une expression EL. Le code devient lisible et sûr.
Autres tags JSTL utiles :
\n- \n
<c:if test="${condition}">— affichage conditionnel \n <c:choose>— équivalent du switch \n <c:set var="x" value="..." />— création de variable \n <fmt:formatDate>— formatage des dates \n