Expresiones EL no evaluadas en JSP
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!
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.xml
ve 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.xml
declarado 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.xml
declara 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
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">
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é.