Maven et les “Expression Language” dans les JSP
Quand on suit un tutoriel à la virgule près, en général ça se passe assez bien. Or j’ai plutôt tendance à les ne suivre que dans les grandes lignes, prendre des raccourcis, introduire des variantes. En bref, je trouve toujours formateur de sortir un peu des sentiers battus, car c’est là que l’on fait les découvertes les plus improbables, comme l’impact de l’utilisation de Maven sur les
Expression Language
(EL) comme ${var}
dans les JSP.
Situation de départ
Dans le tutoriel que j’utilisais, je devais créer une application Web, donc créer un Projet Web Dynamique
dans Eclipse, et dans ce cas tout va bien.
Mais il existe de beaux outils comme Maven, qui font tout automatiquement, et même plus!
Alors j’ai créé un projet en utilisant un Archetype Web Application
.
À partir de là, on ajoute les dépendances Servlet
et Taglib
dans le POM
:
<dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.4-20040521</version> <type>jar</type> <scope>provided</scope> </dependency> <dependency> <groupId>taglibs</groupId> <artifactId>standard</artifactId> <version>1.1.2</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.1.2</version> <type>jar</type> <scope>compile</scope> </dependency>
Puis on crée un
index.jsp
à la racine de l'application, qui contiendra le code suivant:<%@ taglib uri="https://java.sun.com/jsp/jstl/core" prefix="c" %> <html> <head> <title>Simple Webapp!</title> </head> <body> <c:set var="a" value ="coucou"/> <span style="color:#ff0000">${a}</span> </body> </html>
Enfin, vous lancez votre application, et vous vous attendez à obtenir ceci sur votre navigateur:
coucou
mais vous obtenez :
${a}
Autrement dit : la variable n’a pas été interprétée.
Et le problème est valable pour toutes les utilisations des Expression Language
.
Les Expression Language
(EL) permettent de manipuler les données au sein d’une page JSP (ou d’un fichier *.tag) plus simplement qu’avec les scriptlets Java.
Comment résoudre le problème ?
Voilà le descripteur de déploiement web.xml fourni par l’archetype Maven.
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "https://java.sun.com/dtd/web-app_2_3.dtd" > <web-app> <display-name>Archetype Created Web Application</display-name> </web-app>
Il faut ajouter un certain nombre d'attributs à la balise
web-app
, que l'on peut récupérer sur une application web créée "à l'ancienne".<?xml version="1.0" encoding="UTF-8"?> <web-app id="mywebapp" version="2.4" xmlns="https://java.sun.com/xml/ns/j2ee" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://java.sun.com/xml/ns/j2ee https://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <display-name>Archetype Created Web Application</display-name> </web-app>
L'utilisation des EL nécessite une application web J2EE 1.4 (Servlet 2.4 / JSP 2.0), ou versions supérieures. Or le descripteur de déploiement fourni par Maven ne spécifie aucun attribut, donc par défaut, l'application web utilise des versions de Servlet / JSP à l'évidence plus anciennes étant donné que les EL ne sont pas supporté.
Ce genre de problématique nous en rappelle une autre à laquelle nous sommes confrontés bien plus souvent, à savoir que par défaut, Maven utilise un compilateur Java 1.4 à moins de spécifier une configuration différente en ajoutant ceci dans la section
build
/plugins
duPOM
:<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.6</source> <target>1.6</target> </configuration> </plugin>
Pour finir
Cette recherche m'aura été bénéfique. J'ai pu ainsi me rendre compte qu'un projet créé à partir d'un archetype Maven n'est pas tout à fait prêt à l'emploi. L'utilité des attributs dans la balise
web-app
(à propos desquels je ne m'étais pas interrogé auparavant) a été mise en évidence.