Expresiones EL no evaluadas en JSP

Resuelto Gleb S asked hace 9 años • 5 respuestas

Hay un pequeño problema con mi aplicación web servlets/jsp. Estoy intentando usar jstl en la página jsp. Cuando uso cualquier etiqueta, por ejemplo:

<c:out value="${command}"/>

me muestra

${command} 

en mi navegador en lugar del valor del parámetro 'comando'. Estoy usando maven (y supongo que el problema está aquí). Aquí están las dependencias de pom xml:

<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>javax.servlet-api</artifactId>
  <version>3.0.1</version>
  <scope>provided</scope>
</dependency>
<dependency>
  <groupId>jstl</groupId>
  <artifactId>jstl</artifactId>
  <version>1.2</version>
</dependency>

mi etiqueta de declaración web.xml:

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

y parte jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<html>

<head>
<title>Parsing results</title>
<link type="text/css" rel="stylesheet" href="css/page.css"/>
<link type="text/css" rel="stylesheet" href="css/table.css"/>
</head>

<body>
<h2 align="center">Results of 
parsing. Parsing method = <c:out value="${command}"/></h2>.......

EDITAR: El código que establece el valor del comando es simple:

request.setAttribute("command", parser.getName());

luego va

request.getRequestDispatcher(redir).forward(request, response);

¡Dime por favor qué estoy haciendo mal! ¡Gracias!

Gleb S avatar May 06 '15 22:05 Gleb S
Aceptado

Sí, tengo doctype en web.xml<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "java.sun.com/dtd/web-app_2_3.dtd"; >

Elimínelo y asegúrese de que se <!DOCTYPE>declare conforme a Servlet 2.4 o posterior y que todo debería estar bien.web.xml<web-app>

Un Servlet válido compatible con Servlet 3.0 (Tomcat 7, JBoss AS 6-7, GlassFish 3, etc.) se web.xmlve como se muestra a continuación en su totalidad , sin ninguno <!DOCTYPE>:

<?xml version="1.0" encoding="UTF-8"?>
<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">

    <!-- Config here. -->

</web-app>

Para Servlet 3.1 (Tomcat 8, WildFly 8-11, GlassFish/Payara 4, etc.) se ve así:

<?xml version="1.0" encoding="UTF-8"?>
<web-app 
    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
    version="3.1">

    <!-- Config here. -->

</web-app>

Para Servlet 4.0 (Tomcat 9, WildFly 12-21, GlassFish/Payara 5, etc.) se ve así:

<?xml version="1.0" encoding="UTF-8"?>
<web-app 
    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
    version="4.0">

    <!-- Config here. -->

</web-app>

Para Servlet 5.0 (Tomcat 10.0, WildFly 22-26, GlassFish/Payara 6, etc.) se ve así:

<?xml version="1.0" encoding="UTF-8"?>
<web-app 
    xmlns="https://jakarta.ee/xml/ns/jakartaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
    version="5.0">

    <!-- Config here. -->

</web-app>

Para Servlet 6.0 (Tomcat 10.1, WildFly 27+, GlassFish/Payara 7, etc.) se ve así:

<?xml version="1.0" encoding="UTF-8"?>
<web-app 
    xmlns="https://jakarta.ee/xml/ns/jakartaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_6_0.xsd"
    version="6.0">

    <!-- Config here. -->

</web-app>

Cuando utilice JSTL 1.1 o posterior, debe asegurarse de que esté web.xmldeclarado de tal manera que la aplicación web se ejecute al menos en el modo Servlet 2.4; de lo contrario, las expresiones EL no funcionarán en la aplicación web.

Cuando todavía tiene un Servlet 2.3 o anterior <!DOCTYPE>o <web-app>en versión web.xml, aunque ya tenga un Servlet 2.4 o XSD más reciente, aún se verá obligado a ejecutarse en el modo Servlet 2.3 o anterior, lo que provocará que las expresiones EL fallen.

La razón técnica es que EL era originalmente parte de JSTL 1.0 y no estaba disponible en Servlet 2.3/JSP 1.2 y anteriores. En JSTL 1.1, EL se eliminó de JSTL y se integró en JSP 2.0, que va junto con Servlet 2.4. Por lo tanto, si se web.xmldeclara que ejecuta la aplicación web en Servlet 2.3 o modo anterior, entonces JSP esperaría encontrar EL en la biblioteca JSTL, pero esto a su vez fallaría si se trata de una versión JSTL más nueva, que carece de EL.

Ver también:

  • Diferencia entre JSP EL, JSF EL y Unified EL : para conocer la historia de EL
  • Nuestra página wiki de JSTL
  • ¿Cómo instalar JSTL? Falla con "El uri absoluto no se puede resolver" o java.lang.NoClassDefFoundError o java.lang.ClassCastException
BalusC avatar May 06 '2015 16:05 BalusC

En mi caso, para el archivo web.xml (versión = "3.0"), tuve que ejecutar la aplicación en el servidor Tomcat v.8 en lugar de v.7; de lo contrario, tuve el mismo problema que usted. Espero que esto ayude a alguien...

<?xml version="1.0" encoding="ISO-8859-1" ?>
<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">
Dodi avatar Feb 02 '2016 16:02 Dodi

La configuración <%@ page isELIgnored="false" %>en la parte superior de la página me ayudó. No sé por qué fue la raíz del problema en mi caso. Aún no está claro por qué.

Eljah avatar May 08 '2020 16:05 Eljah