此前开发用的比较多Ajax进行异步交互即数据的显示,最近使用jsp页面进行页面与服务器交互时突然一个很怪的问题,强大的 ${} 失效了,读不出数据,由于使用的是springMVC,所以自己使用spring的test模块进行测试了请求与数据的返回是否有效,经过测试请求后数据可以通过request请求域获得(关于如何使用spring的test模块进行模拟请求进行测试spring的程序,关注自己的另一个博客有详细说明)。那么就可以断定是el表达式有问题。解决方法及思路:
开发环境:servlet是3.1.0、jdk1.7、tomcat 7
0.检查jstl的jar或者说依赖(正确)是否导入
我的依赖:
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
是没有问题的
1.检查是否在jsp页面上引入标签
经过检查,确实引入:
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
2.检查<web-app>的约束版本
我的如下:<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" >
经过查阅资料:这里也拿过来别人查阅官方文档后翻译的: 如果isELIgnored是true,当EL表达式出现在文本或者标签属性时被忽略。如果是false,则EL表达式通过容器来决定如何解析 ,只有属性有返回表达式被设置为true或者表达式是一个延迟表达式时不解析。
isELIgnored的值取决于web应用部署描述符的版本。使用Servlet2.4的描述符的JSP页面默认是解析EL表达式,即表达式有效
。这默认提供了大部分应用想要的情况。而使用Servlet2.3或者更早的描述符的JSP页面默认是忽略EL表达式的,即不解析EL表
达式,这样就提供了向后兼容性。
所以说,两种解决方法:
解决
01.在每个jsp页面增加声明
声明:
<%@page isELIgnored="false" %> 经过测试可以使用EL表达式了,问题解决 但是缺陷就是每个页面都要加,累死
02.更改<web-app>的约束版本
如官文档所说,2.3及以下版本isELIgonred是true的,2.4及以上的就默认是false,所以根据需要修改 我改成:<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> 这样就没有问题了,也可使用EL