Spring Boot无法渲染JSP文件,浏览器反而下载该文件求助
我太懂这种查了一堆技术文章却还是卡壳的挫败感了——浏览器不渲染JSP反而把它当文件下载,这绝对是Spring Boot配置JSP时最容易踩的坑之一。既然你已经配了基础的文件结构、pom.xml、application.properties、启动类和Controller,还加了解析器却没解决,那咱们从几个最容易被忽略的关键点入手排查:
先确认JSP核心依赖是否齐全
Spring Boot默认不会自动引入JSP的编译和运行依赖,这是很多人一开始就踩的坑。打开你的pom.xml,检查是否包含这两个关键依赖:<!-- 内嵌Tomcat的JSP编译支持 --> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> <!-- 如果是war包部署可以去掉scope,jar包的话建议设为compile --> <scope>compile</scope> </dependency> <!-- JSTL标签库支持 --> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> </dependency>如果你用的是Spring Boot 3.x,注意依赖要换成Jakarta EE版本:
<dependency> <groupId>jakarta.servlet.jsp.jstl</groupId> <artifactId>jakarta.servlet.jsp.jstl-api</artifactId> </dependency> <dependency> <groupId>org.glassfish.web</groupId> <artifactId>jakarta.servlet.jsp.jstl</artifactId> </dependency>检查application.properties的视图解析配置
必须明确指定JSP的前缀和后缀,否则Spring找不到对应的视图文件。确保你的配置里有这些内容:# JSP文件所在的目录前缀,要和你的实际文件结构对应 spring.mvc.view.prefix=/WEB-INF/jsp/ # JSP文件的后缀 spring.mvc.view.suffix=.jsp # 开启内嵌Tomcat的JSP支持(默认可能为true,但显式设置更稳妥) server.servlet.jsp.enabled=true # 确保Spring MVC的Servlet路径正确,避免请求映射冲突 spring.mvc.servlet.path=/确认JSP文件的存放路径是否合规
路径不对的话,Spring根本找不到你的JSP文件,自然会把它当成静态资源下载:- 如果你用war包结构:JSP必须放在
src/main/webapp/WEB-INF/jsp/目录下(对应上面的prefix配置); - 如果你用jar包结构:Spring Boot默认不支持
webapp目录,需要把JSP移到src/main/resources/META-INF/resources/WEB-INF/jsp/,同时保持prefix配置为/WEB-INF/jsp/。
- 如果你用war包结构:JSP必须放在
排查Controller的返回逻辑
别小看这个细节——如果你的Controller方法加了@ResponseBody注解,Spring会把返回值当成纯文本/JSON直接返回,浏览器就会把它当成文件下载。确保你的Controller是这样的:@Controller // 注意是@Controller,不是@RestController public class YourController { @GetMapping("/your-path") public String yourMethod() { // 返回的是视图名称,对应prefix+返回值+suffix return "your-jsp-filename"; } }用
@RestController的话,默认会给所有方法加上@ResponseBody,这也会导致JSP无法渲染。检查自定义解析器是否冲突
你提到在Controller同包下加了解析器,要警惕这个自定义解析器是不是覆盖了Spring默认的InternalResourceViewResolver(负责解析JSP的视图解析器)。可以先暂时注释掉自定义解析器的代码,重启应用看看问题是否解决。如果解决了,说明你的自定义解析器优先级过高或者没有正确处理JSP视图,需要调整它的order属性,让它的优先级低于默认的JSP解析器。
按照这个顺序一步步排查,大概率能找到问题所在——毕竟JSP渲染失败的核心原因基本都逃不出这几个点。
内容的提问来源于stack exchange,提问作者Martin Larizzate

