Spring Boot 2.6.0整合JSP时pageContext.request.contextPath为空求助
问题原因
- 依赖范围配置不匹配
你将spring-boot-starter-tomcat、tomcat-embed-jasper的scope设为provided,该配置仅适用于打war包部署到外置Tomcat的场景。如果是直接运行Spring Boot可执行jar包启动项目,provided范围的依赖不会被打包进运行包,会导致JSP解析组件缺失,EL表达式无法正常解析pageContext隐式对象。 - JSP存放路径错误
Spring Boot默认要求JSP文件存放在src/main/webapp目录下,你配置的视图前缀为/templates/jsp/,如果你的JSP放在了src/main/resources/templates/jsp/路径下,JSP引擎无法正常解析该路径的文件,会导致上下文初始化异常,无法正确获取隐式对象。 - 直接访问JSP文件
如果你直接在地址栏输入JSP文件路径访问,没有经过Spring MVC控制器跳转,Spring MVC不会完成JSP上下文的完整初始化,也会导致pageContext相关属性取值异常。 - 默认上下文路径为空
如果未配置server.servlet.context-path,Spring Boot默认的上下文路径就是空字符串,这种属于正常行为,并非取值失败,如果需要路径带项目前缀,手动配置即可。
修复建议
- 调整依赖scope:如果采用jar包方式运行,去掉
spring-boot-starter-tomcat和tomcat-embed-jasper的<scope>provided</scope>配置;如果采用war包部署到外置Tomcat,保留该配置即可,外置容器启动不会出现该问题。 - 调整JSP存放路径:将所有JSP文件移动到
src/main/webapp/templates/jsp/目录下,不要放在resources目录中。 - 通过控制器跳转访问JSP:新增对应控制器接口,通过Spring MVC跳转返回视图,示例代码:
@Controller public class HomeController { @GetMapping("/home") public String getHomePage() { return "home"; // 对应JSP文件名,无需加.jsp后缀 } }
后续通过接口地址(如http://localhost:8080/home)访问页面即可。
- 手动配置上下文路径(可选):如果需要项目路径带统一前缀,在application.properties中添加配置:
server.servlet.context-path=/你的项目名称
配置后${pageContext.request.contextPath}会自动拼接该前缀。
- 兼容性替代方案:使用JSTL的
<c:url>标签生成静态资源路径,会自动适配上下文路径,写法如下:
<link rel="stylesheet" href="<c:url value='/static/default-theme.css'/>" />
该写法和你原来的实现逻辑一致,EL解析兼容性更好。
内容的提问来源于stack exchange,提问作者mevada.yogesh
相关产品推荐
相关产品推荐

