2009-04-27 17 views
30

Ich habe eine JSP-Seite auf Tomcat 5.5 ausgeführt. Ich habe den folgenden Code:JSP: EL-Ausdruck wird nicht ausgewertet

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

Der Ausgang Ich erhalte ist:

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

Ich trainiere kann nicht, warum die foreach-Schleife funktioniert, aber die Ausgabe nicht funktioniert. Jede Hilfe, die jemand geben könnte, wäre großartig.

Antwort

62

Ich weiß, dass es standardmäßig aktiviert sein sollte, aber ich renne hin und wieder (oder sogar auf derselben Seite, die das Verhalten ändert), wo die EL-Verarbeitung nicht stattfindet. folgendes an die Spitze von solchen Seiten sollten das Problem beheben Hinzufügen:

<%@ page isELIgnored="false" %> 

Ich füge es zu jeder Seite, weil es tut nicht weh, und ich weiß noch nicht die Ursache, die gelegentlich eine Seite verursacht aufhören, die EL-Ausdrücke zu interpretieren.

+2

auf Tomcat 5.5, gibt es zwei mögliche Gründe (nur?): Ungültiges Schema in web.xml oder el- ignorierte Konfigurationsoption. –

+1

Ich (und andere) hatten eine einzelne Seite funktioniert gut und, nachdem etwas auf der Seite geändert (dh, etwas HTML hinzufügen), hört es einfach auf, die EL-Ausdrücke zu bewerten. Die einzige Erklärung, die ich mir vorstellen kann, ist ein Bug in Tomcat, aber es lohnt sich nicht, zu tief hinein zu graben, da die manuelle Aktivierung (über den obigen Code) das Problem löst. – RHSeeger

+4

Wenn Sie Ihre Webanwendung mit Maven Archetype erstellt haben, lautet die richtige Antwort: http://StackOverflow.com/a/25372735/20654 – OscarRyz

0

Siehe meine Antwort bei Javascript String.replace(/\$/,str) works weirdly in jsp file aus möglichen Gründen.

Längere Antwort: $ {i} ist Ausdruck in so genannter 'Ausdruckssprache'. Manchmal kann Expression Language deaktiviert werden. Siehe obige Antwort für mögliche Gründe und Möglichkeiten, wie Sie es aktivieren können.

0

Verwenden Sie tomcat6. Es erfordert keine Konfiguration für EL in web.xml.

+2

Tomcat 5.5 erfordert auch keine Konfiguration für EL in web.xml. Tomcat 5.0 tut es auch nicht. Wenn Sie ein Problem damit hatten, liegt es woanders. – BalusC

38

Ich hatte gerade das gleiche Problem und verbrachte für immer versucht herauszufinden, was los war.

Ich habe viele Web-Apps von Grund auf neu entwickelt. Warum war dieser plötzlich nicht kooperierend?

Ein Unterschied war diesmal die Maven Webapp Archetype, um die Projektstruktur zu generieren. Es erstellt eine Datei web.xml, die wie folgt aussah:

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

Sobald ich das als mein Problem erkannte, war ich sicher, dass ich die Antwort hatte. Also habe ich einen meiner 2.5 web.xml-Header kopiert, neu erstellt und neu implementiert. Keine Zigarre. Ich konnte nicht glauben, dass das nicht das Problem war. Bereinigt das Projekt, Tomcat neu gestartet. Nee.

RHSeeger Antwort führte mich zu versuchen, in die <% @ page isELIgnored = "false"%>. Das hat das Problem gelöst. Aber ich wollte immer noch wissen, warum el anfängt ignoriert zu werden.

Ich dachte, das EL wurde ignoriert, weil etwas mit meiner web.xml nicht stimmte, also habe ich es im Vergleich mit einer anderen Webapp-web.xml genau untersucht, die mir gut geklappt hat. Keine merklichen Unterschiede.

Dann entfernte ich die <% @ page isELIgnored = „false“%> von meiner JSP, und umgeschichtet, würde der el unter der Annahme nicht erneut bewertet werden, aber viel zu meiner Überraschung wurde der el bewerten in Ordnung!

Dann muss es ein Caching-Problem sein, ich habe meine Änderungen an der web.xml rückgängig gemacht, um das Problem neu zu erstellen. Ich habe mich umgezogen, aber trotzdem wurde das EL korrekt ausgewertet, sogar mit der schlechten web.xml. Dann putzte ich mein gesamtes Projekt (ich benutze eine explodierte Bereitstellung), blies das explodierte Verzeichnis weg und erstellte es neu. Ich habe dann Tomcat neu gestartet. Trotzdem scheint das el trotz der schlechten web.xml richtig ausgewertet zu werden.

Endlich dämmerte es mir.Ich habe einfach einen Platz an einer Stelle in der JSP hinzugefügt, neu gepackt und die Seite aktualisiert. Bingo! Jetzt wurde das EL nicht ausgewertet. Das Problem war mit der web.xml. Es würde weiter durch die Tatsache kompliziert, dass die JSPs nicht neu kompiliert würden, wenn sie sich nicht geändert hätten. Nicht sicher, ob Tomcat eine MD5-Summe verwendet, um zu entscheiden, ob die JSPs neu kompiliert werden müssen oder was. Eine andere Möglichkeit ist, dass ich Kacheln verwende, von denen ich weiß, dass sie einen Caching-Mechanismus haben, aber ich würde nicht erwarten, dass sie einen Tomcat-Neustart überleben.

Wie auch immer, es sei denn, Sie modifizieren Ihre JSPs nach dem Beheben der web.xml, alle Wetten sind aus, ob die EL wieder zu arbeiten beginnt. Hoffe, dass dies jemand anderem Kopfschmerzen erspart. Ich bin auch interessiert, wenn mir jemand sagen kann, ob Tomcat nicht die JSPs neu kompiliert oder die Ausgabe der JSP zwischenspeichert. Ich bin mir ziemlich sicher, dass es die Neukompilierung ist, denn zur Kompilierungszeit sollte die JSP herausfinden müssen, was mit den $ {} el-Ausdrücken geschehen soll, oder? Tiles können nicht wirklich zwischenspeichern, was in die el-Ausdrücke substituiert wird, sonst würden alle Arten von Problemen auftreten.

+0

Vielen Dank, das ist genau das, was ich durchgemacht habe - erstellt von archetype, und EL und JSTL funktionieren nicht, obwohl JSP-Datei genau denselben Code verwendet wie eine vorherige App, die vorher funktioniert hat. Die namespaces web.xml wurden repariert, neu gestartet, funktioniert immer noch nicht. endlich die JSP geändert und sortiert! –

+0

Es war Tomcat nicht die JSPs neu kompilieren. Es verfolgt die letzte Änderung der JSP-Datei - neuere Versionen verfolgen auch die letzten modifizierten Zeiten der Abhängigkeiten. Diese werden mit einer konfigurierbaren Frequenz überprüft (in der Regel 5 Sekunden, wenn der Speicher bedient wird) und die Neukompilierung wird ausgelöst, wenn eine Änderung festgestellt wird. Die .java-Datei kann sich im Tomcat-Arbeitsverzeichnis befinden und bleibt bei Neustarts erhalten. –

+0

@kevinmrohr Vielen Dank für Ihr detailliertes Experiment und die Antwort. – smwikipedia

1

hatte ähnliches Problem zu Kevin, ich benutzte Maven, um mit webapp anzufangen, aber keine Freude mit dem Auswerten von Ausdrücken in jsp - ich musste DOCTYPE-Header entfernen - alles ist jetzt gut, ohne mit isELIgnored Bit zu spielen - maven erzeugt web.xml welches Links zu 2.3, die wie Peter sagte, hat EL standardmäßig deaktiviert

9

Stellen Sie sicher, dass die relevanten Namespaces in der web.xml enthalten sind. Versuchen Sie einfach

<web-app> 

mit so etwas wie

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

Es es für mich zu ersetzen, festgelegt. Sie finden die richtigen Namespaces für Ihre Tomcat-Instanz in den Beispiel-Apps, die mit einer Tomcat-Installation geliefert werden.

+0

Funktioniert und rettete meinen Tag! : D – Philipp

0

Von Controller:

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

In Aussicht:

<%@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> 

Ausgang:

Name: Test 
15

Es ist der Header in web.xml, die das Problem

Unter Maven verursacht generierte Header stoppt EL wird geprüft.

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

Verwendung unter Kopf EVAL die 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"> 
+0

das ist mein Tag retten! Vielen Dank! – Maigret

+0

gr8 ...... danke –

+0

Diese Lösung funktioniert. –

2

Für Interessenten, die entsprechende XML-Syntax für JSP 2.0 sind:

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