Spring应用中Get方法返回HTML页面失败(404白标错误)排查
嘿,我之前从Spring MVC转Spring Boot的时候也踩过这个404的坑,咱们一步步来捋清楚问题出在哪~
先搞懂Spring Boot对HTML文件的处理逻辑
Spring Boot对HTML资源的处理分两种场景,咱们先对应你的需求来排查:
场景1:直接返回静态HTML文件(不需要模板渲染)
如果你的HTML是纯静态页面,不需要动态数据填充,那得注意这几点:
- 文件位置要对:Spring Boot默认会从这几个目录加载静态资源:
src/main/resources/static(最常用)src/main/resources/publicsrc/main/resources/resourcessrc/main/resources/META-INF/resources
把你的HTML文件放到上面任意一个目录里,比如把index.html放在static下,直接访问http://localhost:8080/index.html就能打开,甚至不需要写控制器。
- 如果要通过控制器跳转:控制器方法得用
forward:或者redirect:前缀,比如:
@GetMapping("/goIndex") public String goIndex() { // forward是服务器内部跳转,redirect是客户端重定向,选适合的就行 return "forward:/index.html"; }
场景2:用模板引擎渲染HTML(类似之前JSP的动态页面)
如果你需要像JSP那样给HTML填充动态数据,那得用模板引擎(比如Thymeleaf,Spring Boot官方推荐),步骤如下:
- 引入模板引擎依赖(以Maven为例),在
pom.xml里加:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency>
- 放对文件位置:把HTML文件放到
src/main/resources/templates目录下,比如user.html。 - 控制器写法:直接返回文件名(不需要加后缀),比如:
@Controller // 注意别写成@RestController! public class UserController { @GetMapping("/user") public String userPage(Model model) { model.addAttribute("username", "张三"); return "user"; // 自动匹配templates/user.html } }
最容易踩的几个坑
- 别搞混@Controller和@RestController:
@RestController会把返回值直接序列化成JSON,不会跳转视图,这是很多人刚转Spring Boot时犯的错! - 包扫描要正确:Spring Boot启动类的包要包含控制器所在的包,比如启动类在
com.example.demo,控制器就得在com.example.demo.controller或者子包下;如果不在,要在启动类上加@ComponentScan(basePackages = "你的控制器包路径")。 - 清理旧的JSP配置:如果你之前配置过JSP的视图解析器(比如
spring.mvc.view.prefix和spring.mvc.view.suffix),现在要删掉这些配置,不然会干扰HTML视图的解析。
按照上面的步骤排查,应该就能解决这个白标404错误啦!
内容的提问来源于stack exchange,提问作者Олег Михайлов
相关产品推荐
相关产品推荐

