Vous vous êtes décidé d’écrire les pages JSP 2.0 avec la JSTL 1.1 le tout en XML[1]. Il faut dire au revoir aux scriptlets et bonjour aux EL ! 😉 Mais vous rencontrez peut-être cette erreur :

org.apache.jasper.JasperException: /index.jsp(33,32) According to TLD or attribute directive in tag file, attribute value does not accept any expressions
	org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:510)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:375)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	java.lang.reflect.Method.invoke(Method.java:585)
	org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:243)
	java.security.AccessController.doPrivileged(Native Method)
	javax.security.auth.Subject.doAsPrivileged(Subject.java:517)
	org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:275)
	org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:161)
	java.security.AccessController.doPrivileged(Native Method)
	java.security.AccessController.doPrivileged(Native Method)
	org.apache.struts.action.RequestProcessor.doForward(RequestProcessor.java:1085)
	org.apache.struts.tiles.TilesRequestProcessor.doForward(TilesRequestProcessor.java:263)
	org.apache.struts.tiles.TilesRequestProcessor.processTilesDefinition(TilesRequestProcessor.java:239)
	org.apache.struts.tiles.TilesRequestProcessor.internalModuleRelativeForward(TilesRequestProcessor.java:341)
	org.apache.struts.action.RequestProcessor.processForward(RequestProcessor.java:572)
	org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:221)
	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
	org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:743)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	java.lang.reflect.Method.invoke(Method.java:585)
	org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:243)
	java.security.AccessController.doPrivileged(Native Method)
	javax.security.auth.Subject.doAsPrivileged(Subject.java:517)
	org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:275)
	org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:161)

Votre page JSP commence sûrement par quelque chose qui ressemble à ceci :

<jsp:root
	xmlns:jsp="http://java.sun.com/JSP/Page"
	xmlns:c="http://java.sun.com/jstl/core"
	xmlns="http://www.w3.org/1999/xhtml"
	version="2.0">

Si c’est le cas, la déclaration ci-dessus correspond à la JSTL 1.0.

Le problème vient du fait que vous utilisez un moteur JSP 2.0 qui traite les EL avant d’appeler les taglibs. Ce moteur n’est pas compatible avec les taglibs qui intègrent la gestion des EL comme le fait la JSTL 1.0. Pour résoudre ce problème, il faut utiliser la JSTL 1.1 qui est faite pour les JSP 2.0.

Pour déclarer l’utilisation des JSTL 1.1, votre page JSP doit commencer ainsi :

<jsp:root
	xmlns:jsp="http://java.sun.com/JSP/Page"
	xmlns:c="http://java.sun.com/jsp/jstl/core"
	xmlns="http://www.w3.org/1999/xhtml"
	version="2.0">

Je profite pour vous rappeler les excellentes présentation d’adiGuba sur :

Vous allez enfin pouvoir écrire des JSP 2.0 tout en utilisant la puissance des EL.

Notes

[1] Appelées également JSPX.