问题
最近开发时,在用JSP页面中有如下代码:
<%
request.setAttribute("contextPath",request.getContextPath());
%>
<script>
var Global={};
Global.contextPath='${contextPath}';
</script>
按照正常的执行结果,Global.contextPath应该被赋值为request对象的contextPath属性值,也就是当前项目的上下文路径,但是当我使用console.log(Global.contextPath)
进行输出时,却只显示${contextPath}
,也就是说没有取到contextPath属性的值,只是把${contextPath}当成字符串输出了。
这个问题让我有些郁闷,明明之前的项目中一模一样的代码都没问题,为啥到我这就不行了呢?在查阅了很多资料,反复测试了很久之后我才终于找到了问题的所在。
解决方案
造成上述代码赋值失败的原因其实并不在于代码逻辑上的错误,而其实是一个很容易被忽略的问题:web.xml的web-app元素声明的版本号太低,必须是2.4以上的版本才能够在js中解析request属性并赋值给js变量。
于是我又检查了一下我的web.xml文件,果然版本是2.3,低于2.4,这是IDEA中maven web工程默认生成的版本,也算是一个大坑了。
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
把它改成3.0版本之后问题终于解决了。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">