web-dev-qa-db-fra.com

JSP: l'expression EL n'est pas évaluée

J'ai une page JSP sous Tomcat 5.5. J'ai le code suivant:

 <c:forEach var="i" begin="1" end="10" step="1">
  <c:out value="${i}" />
  <br />
</c:forEach>

Le résultat que je reçois est:

${i} 
${i} 
${i} 
${i} 
${i} 
${i} 
${i} 
${i} 
${i} 
${i} 

Je n'arrive pas à comprendre pourquoi la boucle forEach fonctionne mais la sortie ne fonctionne pas. Toute aide que quiconque pourrait donner serait formidable.

30
James

Je sais que cela est supposé être activé par défaut, mais je rencontre de temps en temps des pages (ou même la même page qui modifie le comportement) où le traitement EL n’a pas lieu. Ajouter ce qui suit en haut de ces pages devrait résoudre le problème:

<%@ page isELIgnored="false" %> 

Je l'ajoute à chaque page car cela ne fait pas mal, et je ne connais toujours pas la cause fondamentale qui empêche parfois une page d'interpréter les expressions EL.

64
RHSeeger

Je viens d'avoir ce même problème et j'ai passé des heures à essayer de comprendre ce qui n'allait pas. 

J'ai développé de nombreuses applications Web à partir de zéro. Pourquoi soudainement celui-ci ne coopéra-t-il pas? 

Une différence était cette fois j'ai utilisé l'archétype de maven webapp pour générer la structure de projet. Il a créé un fichier web.xml qui ressemblait à ceci:

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://Java.Sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>
</web-app>

Une fois que je me suis rendu compte que c'était un problème, j'étais sûr d'avoir la réponse. J'ai donc copié l'un de mes en-têtes 2.5 web.xml, reconstruit et redéployé. Pas de cigare. Je ne pouvais pas croire que ce n'était pas le problème. Nettoyé le projet, redémarré Tomcat. Nan. 

La réponse de RHSeeger m'a amené à essayer d'insérer la <% @ page isELIgnored = "false"%>. Cela a résolu le problème. Mais je voulais toujours savoir pourquoi el avait commencé à être ignoré.

J'ai pensé que l'el était ignoré à cause d'un problème avec mon fichier web.xml, je l'ai donc examiné de près par rapport au fichier web.xml d'une autre application qui, je le savais, fonctionnait bien. Aucune différence notable. 

Ensuite, j'ai supprimé la <% @ page isELIgnored = "false"%> de mon fichier JSP et je l'ai redéployé, en supposant que l'el ne serait pas évalué à nouveau, mais à ma grande surprise, l'el a été évalué correctement!

Puis, pensant qu'il devait s'agir d'un problème de cache, j'ai annulé mes modifications dans le fichier web.xml pour recréer le problème. J'ai redéployé, mais el était toujours évalué correctement, même avec le mauvais web.xml. Ensuite, j'ai nettoyé l'ensemble de mon projet (j'utilise un déploiement éclaté), en supprimant le répertoire éclaté et en le recréant. J'ai ensuite redémarré Tomcat. Pourtant, le el semblait avoir été évalué correctement malgré le mauvais web.xml.

Finalement, j'ai compris. J'ai simplement ajouté un espace à un endroit de la JSP, l'ai reconditionné et actualisé la page. Bingo! Maintenant, le el n'était pas en cours d'évaluation. 

Donc, le problème était avec le fichier web.xml. Cela serait encore compliqué par le fait que les JSP ne seraient pas recompilés à moins d’avoir changé. Je ne sais pas si Tomcat utilise une somme MD5 pour décider si les fichiers JSP doivent être recompilés ou quoi. Une autre possibilité est que j'utilise des mosaïques, qui possèdent un mécanisme de mise en cache, mais je ne m'attendrais pas à ce qu'elles survivent à un redémarrage de Tomcat.

Quoi qu'il en soit, à moins que vous ne modifiiez vos JSP APRÈS avoir corrigé le fichier web.xml, tous les paris sont ouverts quant à savoir si le EL va recommencer à fonctionner. J'espère que cela évite à quelqu'un d'autre un mal de tête. Je suis également intéressé si quelqu'un peut me dire s'il s'agissait de Tomcat qui ne recompilait pas les fichiers JSP ou de mosaïques mettant en cache la sortie du fichier JSP. Je suis à peu près sûr que c'est la recompilation, car au moment de la compilation, le JSP devrait déterminer quoi faire avec les expressions $ {} el, n'est-ce pas? Les tuiles ne peuvent pas réellement mettre en cache ce qui est substitué dans les expressions el, sans quoi toutes sortes de problèmes pourraient survenir. 

38
kevinmrohr

C'est l'en-tête dans web.xml qui cause le problème

L'en-tête ci-dessous généré par maven empêche EL d'être évalué.

<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://Java.Sun.com/dtd/web-app_2_3.dtd" >
<web-app>

En utilisant l'en-tête ci-dessous, eval est le EL.

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
xmlns="http://Java.Sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://Java.Sun.com/xml/ns/javaee http://Java.Sun.com/xml/ns/javaee/web-app_2_5.xsd">
16
user3954300

Assurez-vous d'inclure les espaces de noms pertinents dans le fichier web.xml. Juste essayer de remplacer

<web-app>

avec quelque chose comme

<web-app xmlns="http://Java.Sun.com/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://Java.Sun.com/xml/ns/javaee
                      http://Java.Sun.com/xml/ns/javaee/web-app_3_0.xsd"
  version="3.0"
  metadata-complete="true">

Cela a résolu le problème pour moi. Vous pouvez trouver les espaces de noms corrects pour votre instance Tomcat dans les exemples d'applications fournis avec une installation Tomcat.

9
Bouke Woudstra

Pour les personnes intéressées, la syntaxe XML équivalente pour JSP 2.0 est la suivante:

<jsp:directive.page isELIgnored="false"/>
2
Fabien R

avait un problème similaire à Kevin, j’ai utilisé maven pour débuter avec webapp mais ma joie est d’évaluer les expressions dans jsp; comme Peter a déclaré EL a désactivé par défaut

1
greg one

Utilisez Tomcat6. Il ne nécessite aucune configuration pour EL dans web.xml.

0
Maheshkumar.P

Voir ma réponse à Javascript String.replace (/\$ /, str) fonctionne étrangement dans un fichier jsp pour des raisons possibles.

Réponse plus longue: $ {i} est une expression dans ce que l'on appelle le «langage d'expression». Parfois, Expression Language peut être désactivé. Voir la réponse ci-dessus pour les raisons potentielles et les moyens de l'activer.

0
Peter Štibraný

De contrôleur:

@RequestMapping(value = "createcustomer",method = RequestMethod.GET)
    public String customer(Model model)
    {
        Customer cus=new Customer();
        cus.setCustomerNumber("Test");
        model.addAttribute("customer",cus);
        return "createcustomer";
    }

En vue:

<%@taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<%@ taglib prefix="c" uri="http://Java.Sun.com/jstl/core" %> 

<div class="cl">    
   <form:form commandName="customer" method="POST">

      <p>Name: <c:out value="${customer.CustomerNumber}"></c:out></p>

   </form:form>
<div>

Sortie:

Name: Test
0
Md. Rahman