Accueil Nos publications Blog Maven et les « Expression Language » dans les JSP

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 du POM:


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