You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot 2.6.0整合JSP时pageContext.request.contextPath为空求助

问题原因
  1. 依赖范围配置不匹配
    你将spring-boot-starter-tomcat、tomcat-embed-jasper的scope设为provided,该配置仅适用于打war包部署到外置Tomcat的场景。如果是直接运行Spring Boot可执行jar包启动项目,provided范围的依赖不会被打包进运行包,会导致JSP解析组件缺失,EL表达式无法正常解析pageContext隐式对象。
  2. JSP存放路径错误
    Spring Boot默认要求JSP文件存放在src/main/webapp目录下,你配置的视图前缀为/templates/jsp/,如果你的JSP放在了src/main/resources/templates/jsp/路径下,JSP引擎无法正常解析该路径的文件,会导致上下文初始化异常,无法正确获取隐式对象。
  3. 直接访问JSP文件
    如果你直接在地址栏输入JSP文件路径访问,没有经过Spring MVC控制器跳转,Spring MVC不会完成JSP上下文的完整初始化,也会导致pageContext相关属性取值异常。
  4. 默认上下文路径为空
    如果未配置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 20:24:04