JSP中未评估EL表达式

18

我的servlets/jsp Web应用程序有一个小问题。我正在尝试在jsp页面中使用jstl。当我使用任何标签时,例如:

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

它向我展示了

${command} 

我在浏览器中使用的参数'command'值没有生效。我正在使用Maven(我猜问题可能出在这里)。这是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>

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

以及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>.......

编辑: 设置命令值的代码很简单:

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

然后是

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

请告诉我,我做错了什么!谢谢!


你能展示设置 Command 值的 Java 代码吗? - Raphael Amoedo
如果您将JSTL依赖项设置为“provided”,以便它不随应用程序一起部署,会发生什么? - Gimby
1
@BalusC - 是的,我在web.xml中有doctype声明 '<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" >' 在pom文件中,最后只有一个依赖项是junit。 - Gleb S
2
去掉那个文档类型声明,然后重试。 - BalusC
1
@BalusC - 成功了!!非常感谢!!但是你能解释一下doctype失败的原因吗? - Gleb S
显示剩余4条评论
5个回答

38
是的,我在web.xml中有一个doctype:<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "java.sun.com/dtd/web-app_2_3.dtd"; >web.xml中删除<!DOCTYPE>,并确保<web-app>声明符合Servlet 2.4或更新版本,一切都应该正常。
一个有效的Servlet 3.0(Tomcat 7,JBoss AS 6-7,GlassFish 3等)兼容的web.xml应该完全如下所示,没有任何<!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>

对于Servlet 3.1(Tomcat 8,WildFly 8-11,GlassFish/Payara 4等),它的配置如下所示:
<?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>

对于Servlet 4.0(Tomcat 9,WildFly 12-21,GlassFish/Payara 5等),它的配置如下所示:
<?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>

对于Servlet 5.0(Tomcat 10.0,WildFly 22-26,GlassFish/Payara 6等),它的样子如下所示:
<?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>

对于Servlet 6.0(Tomcat 10.1,WildFly 27+,GlassFish/Payara 7等),它的样子如下所示:
<?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>

当使用JSTL 1.1或更新版本时,您需要确保您的web.xml声明为以至少Servlet 2.4模式运行的Web应用程序,否则EL表达式将无法在Web应用程序中工作。
当仍然在web.xml中具有Servlet 2.3或更旧的<!DOCTYPE><web-app>时,即使您已经有了Servlet 2.4或更新的XSD,它仍然会被强制以Servlet 2.3或更旧的模式运行,导致EL表达式失败。
技术原因是,EL最初是JSTL 1.0的一部分,不可用于Servlet 2.3 / JSP 1.2及更早版本。在JSTL 1.1中,EL从JSTL中移除,并集成到JSP 2.0中,与Servlet 2.4相匹配。因此,如果您的web.xml声明为以Servlet 2.3或更旧的模式运行Web应用程序,那么JSP将期望在JSTL库中找到EL,但如果是较新的JSTL版本,则会失败。缺少EL。

另请参阅:


如果我“需要”使用xmi:version =“2.0”进行工作,那么有什么解决方案吗? - L_Cleo
我需要找到一种解决办法!当然,除非我可以使用脚本片段,但那看起来很丑陋和混乱...难道没有其他的解决方案吗? - L_Cleo
将 JSTL 降级到与 Servlet 2.0 兼容的版本。从技术上讲,JSTL 1.0 应该可以工作(请参见上面的答案以了解技术原因)。JSTL 1.1 适用于 Servlet 2.4 或更新版本,因此肯定不会起作用。较新版本的 JSTL,例如 1.2 和 1.2.1,显然是行不通的。 - BalusC
好的,但是代码格式是否相同?我仍然可以迭代映射和其他类似的东西吗?还是代码有一些微小的变化...我试图在互联网上查找一些内容,但我想也许由于您的经验,您可以建议我在哪里查找更好的理解。 - L_Cleo
等等,我在我的web-xml文件的顶部找到了这个:<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> 这是不是意味着它正在使用2.3版本? - L_Cleo
显示剩余2条评论

1
在我的情况下,针对web.xml文件(版本="3.0"),我必须在Tomcat服务器v.8上运行应用程序,而不是v.7,否则我会遇到与您相同的问题。希望这能帮助某些人...
<?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">

1
在页面顶部添加<%@ page isELIgnored="false" %>对我很有帮助。不清楚为什么这是问题的根源,原因尚不明确。

-1
尝试将jdbc驱动程序类放置在WEB-INF -> lib文件夹中,并验证使用的servlet和jar文件版本。在我的情况下,我使用了mssql-jdbc-8.2.2.jar并在pom.xml中更新了相同的内容。

-1

我的JSP页面也无法识别</:choose>,总是执行false条件即。这就是发生的情况。

这是一个内部JSP页面,即

<jsp:include page="your-inner-page.jsp"/>

内部JSP首先加载,没有下面的标签库。它们被放置在外部JSP上。将它们添加到内部对我有用。

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://www.springframework.org/tags" prefix="spring" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>

问题不是关于JSP标签的,而是关于EL表达式的。这两者完全不同。 - BalusC
@BalusC 我理解。OP说<c:out>没有起作用。甚至我的c:choose也没有起作用,因为标签丢失了。这不是相关的吗?为什么要踩呢? - veritas
因为这个答案并没有回答问题。如果 JSTL 没有被正确安装,OP 就不会在 Web 浏览器中看到 ${command} 被打印出来,而是在期望输出一些内容的地方看到一个完全空的字符串,并且整个 <c:out> 标签仍然存在于生成的 HTML 输出中未解析,可以通过在 Web 浏览器中右键单击、查看源代码来查看。 - BalusC
@BalusC 如果我删除了我的错误答案,我会拿回我的两个分数吗? - veritas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接