EL 在 jsp 中不工作,servlet api 之间可能不匹配?
EL not working in jsp, possible mismatch between servlet api's?
我正在尝试测试一个简单的 Web 应用程序以在仅支持 servlet api 2.3 的 servlet 容器上运行。不幸的是,我还没有访问 2.3 容器的权限,所以我尝试在 tomcat.
的最新版本上进行测试
我有以下设置:
- Tomcat 7,它有 servlet api 3.0 并且没有标准的 JSTL 支持
- 在我的 web.xml 中,我声明这样使用 servlet 2.3:
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" >
在我的 Maven 依赖项之一中,我添加了 jstl 库,因此它现在位于我的类路径中:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
不幸的是,我的 EL 不起作用,它们只是按原样呈现。例如:${2+2} 不显示为“4”。这是我的 jsp 页面的片段:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<body>
<h2>Hello World</h2>
<c:out value="${2+2}"/>
</body>
</html>
所以我假设这是因为我的 web.xml 声明(说它是 2.3)不匹配,但我的实际 servlet 容器 (tomcat) 想要使用 3.0 和 jstl 1.2。如果我真的想让它工作,我可以更新我的 web.xml 以也使用 3.0 版。但是,这不适用于 2.3 的(其他)servlet 容器。所以我的问题是,如何测试我的 2.3 webapp,是否有旧版本的 tomcat 也使用 2.3?还是 servlet 3.0 向后兼容,我是不是配置有误?
注意:页面的实际加载和 web 应用程序通常工作正常,只有 EL (${something}) 不计算。
在页面标签
中使用 isELIgnored
<%@ page language="java"
contentType="text/html;
charset=ISO-8859-1" pageEncoding="ISO-8859-1"
isELIgnored="false"%>
首先检查 jstl.jar
和 standard.jar
WEB-INF/lib 文件夹的版本是否正确。
如果您使用的是 servlet 2.3 版或早于 2.3 版,则 EL 默认处于禁用状态,因此您必须启用它意味着默认情况下它是正确的:
isELIgnored ="true"
你必须让它变成假的。
但如果您使用的 servlet 版本高于 2.3,则默认情况下启用它意味着
isELIgnored ="false"
您可以通过
启用或禁用
<%@ page isELIgnored ="true|false" %>
一次只能给一个值true or false
。如果为真,EL 表达式出现在静态文本或标记属性中时将被忽略。如果为 false,则 EL 表达式由容器计算。
我正在尝试测试一个简单的 Web 应用程序以在仅支持 servlet api 2.3 的 servlet 容器上运行。不幸的是,我还没有访问 2.3 容器的权限,所以我尝试在 tomcat.
的最新版本上进行测试我有以下设置:
- Tomcat 7,它有 servlet api 3.0 并且没有标准的 JSTL 支持
- 在我的 web.xml 中,我声明这样使用 servlet 2.3:
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" >
在我的 Maven 依赖项之一中,我添加了 jstl 库,因此它现在位于我的类路径中:
<dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency>
不幸的是,我的 EL 不起作用,它们只是按原样呈现。例如:${2+2} 不显示为“4”。这是我的 jsp 页面的片段:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<body>
<h2>Hello World</h2>
<c:out value="${2+2}"/>
</body>
</html>
所以我假设这是因为我的 web.xml 声明(说它是 2.3)不匹配,但我的实际 servlet 容器 (tomcat) 想要使用 3.0 和 jstl 1.2。如果我真的想让它工作,我可以更新我的 web.xml 以也使用 3.0 版。但是,这不适用于 2.3 的(其他)servlet 容器。所以我的问题是,如何测试我的 2.3 webapp,是否有旧版本的 tomcat 也使用 2.3?还是 servlet 3.0 向后兼容,我是不是配置有误?
注意:页面的实际加载和 web 应用程序通常工作正常,只有 EL (${something}) 不计算。
在页面标签
中使用isELIgnored
<%@ page language="java"
contentType="text/html;
charset=ISO-8859-1" pageEncoding="ISO-8859-1"
isELIgnored="false"%>
首先检查 jstl.jar
和 standard.jar
WEB-INF/lib 文件夹的版本是否正确。
如果您使用的是 servlet 2.3 版或早于 2.3 版,则 EL 默认处于禁用状态,因此您必须启用它意味着默认情况下它是正确的:
isELIgnored ="true"
你必须让它变成假的。
但如果您使用的 servlet 版本高于 2.3,则默认情况下启用它意味着
isELIgnored ="false"
您可以通过
启用或禁用<%@ page isELIgnored ="true|false" %>
一次只能给一个值true or false
。如果为真,EL 表达式出现在静态文本或标记属性中时将被忽略。如果为 false,则 EL 表达式由容器计算。