EL表达式在JSP中不被评估

我的servlets / jsp web应用程序存在一个小问题。 我试图在jsp页面中使用jstl。 当我使用任何标签例如:

<c:out value="${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); 

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

是的,我在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"; > <!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> ,一切都会好的。 一个有效的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,GlassFish 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> 

当使用JSTL 1.1或更新的版本时,你需要确保你的web.xml是以这样的方式声明的,即webapp至少运行于Servlet 2.4 modus,否则EL表达式将不能在webapp中运行。

当在web.xml仍然有一个Servlet 2.3或者更老版本的<!DOCTYPE>时,即使你已经有了一个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或更老版本的modus中运行webapp,那么JSP会希望在JSTL库中找到EL,但是如果它是一个新的JSTL版本,缺少EL,这将会失败。

也可以看看:

  • JSP EL,JSF EL和统一EL之间的区别
  • 我们的JSTL wiki页面

在我的情况下,为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">