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