一、问题
在JSP页面中使用${pageContext.request.contextPath}来访问资源路径时候出现如下问题
- 在浏览器的地址栏出现乱码
- 浏览器页面出现404问题,访问不到对应的资源路径
二、问题分析
- 针对问题1,可以看出地址中出现乱码并且包含URL编码(%7B、%7D),通过URL解码,我们可以得到%7B、%7D分别为“{”、“}”。也就是说这个EL语句${pageContext.request.contextPath}并未解析,那这个错误的路径自然会出现404问题。(查看源码验证,和我们想的一致,如下图所示)
- 问题变成了EL表达式语言在浏览器不解析问题,通过查阅资源得到,2.4之前的web.xml中EL表达式默认是不解析的,所以在2.4之前的web项目中,需要显式的声明解析EL表达式。(我在此处使用的是2.3的版本,是Maven默认骨架创建的)
三、解决方法
- 方法1:在jsp文件的<%@ page %>中添加isELIgnored属性值设置为false。此方法只能作用在当前jsp文件上,如果需要设置更多页面支持EL表达式,需要每个页面添加isELIgnored=“false”属性值。
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
- 方法2:如下所示,修改web项目版本到2.4及以上。这个引用头我是根据此篇博客由IDEA重新生成的。此方法,所有的jsp文件都自动支持使用EL表达式。
<!-- 引入此web.xml头信息 --->
<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_4_0.xsd"
version="4.0">
如果在<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" >