SpringMVC/Spring Boot 控制器返回视图路径(相对 / 绝对路径)核心总结

摘要

SpringMVC 中控制器方法返回的字符串会被解析为视图路径,核心区别在于「相对路径」与「绝对路径」:相对路径 会基于当前请求的 URL 层级自动拼接,绝对路径 (以 / 开头)则直接指向项目根路径。这也是为何请求映射成功(方法执行并打印日志),但部分场景仍报 404 的关键原因。
结合 Spring Boot 项目结构(ok.html在resources/static目录下,Spring Boot 默认将static目录映射为项目的静态资源根路径 ,即static/ok.html对应访问路径http://localhost:8080/ok.html)

接下来用两个具体例子对比「相对路径」和「绝对路径」的差异:

例 1:相对路径(会 404 的情况)

假设控制器代码是这样(返回相对路径 "ok.html"):

java 复制代码
@Controller
public class Demo1Controller {
    // 请求路径:http://localhost:8080/t1/t
    @RequestMapping("/t1/t")
    public String test1() {
        System.out.println("test1方法执行了");
        return "ok.html"; // 相对路径,没有加/
    }
}
  • 此时return "ok.html"是相对路径 ,会基于当前请求的路径/t1/t拼接:解析后的资源访问路径是:http://localhost:8080/t1/ok.html
  • 但 ok.html实际在static目录下(对应访问路径是http://localhost:8080/ok.html),不存在/t1/ok.html这个资源,因路径不匹配所以会报 404。

例 2:绝对路径(成功访问的情况)

就是你现在的代码(返回绝对路径 "/ok.html"):

java 复制代码
@Controller
public class Demo1Controller {
    // 请求路径:http://localhost:8080/t1/t
    @RequestMapping("/t1/t")
    public String test1() {
        System.out.println("test1方法执行了");
        return "/ok.html"; // 绝对路径,加了/
    }
}
  • 此时return "/ok.html"是绝对路径 ,/代表「项目根路径」,会直接解析为:资源访问路径:http://localhost:8080/ok.html
  • 这个路径正好对应static目录下的ok.html,所以能成功访问。

再举一个更直观的例子

把请求路径改成更层级深的/a/b/c:

java 复制代码
@Controller
public class Demo1Controller {
    // 请求路径:http://localhost:8080/a/b/c
    @RequestMapping("/a/b/c")
    public String test2() {
        // 情况1:返回相对路径"ok.html" → 解析为http://localhost:8080/a/b/ok.html(404)
        // 情况2:返回绝对路径"/ok.html" → 解析为http://localhost:8080/ok.html(成功)
        return "/ok.html";
    }
}

无论你的请求路径层级多深,只要返回加了/的绝对路径 ,都会直接映射到项目根路径下的静态资源(即static目录下的文件)。

总结

  1. 控制器返回字符串默认是相对路径,基于当前请求 URL 层级拼接;
  2. 以 / 开头为绝对路径,直接映射项目根路径,可避免层级拼接导致的 404;
  3. 404 是视图路径解析失败,而非请求映射失败,因此方法仍会执行并打印日志。
相关推荐
天天被压力15 分钟前
【别再到处找免费股票数据API了:官方204个接口,32篇一次讲透 #02】涨停跌停与特色股池:5类股池接口一次拉全
java·人工智能·python
Wx-bishekaifayuan16 分钟前
springboot甘肃特产服务平台50301-计算机课程设计、毕业设计
spring boot·后端·python·django·课程设计·express·旅游
Thneonl19 分钟前
服务不通先别抓包:DNS 解析器的坑比内核网络栈多
后端·程序员
Thneonl19 分钟前
一启动就 Exited(137):内存限制背后藏了四个参数
后端·架构
斯维赤26 分钟前
从 @Tool 到 Agent 流水线:LangChain4j 进阶教学,一个库打全套
java·后端
对象存储与RustFS27 分钟前
RustFS 生产部署实战:Docker / 二进制 / K8s Operator 三条路径怎么选
后端
FYKJ_201029 分钟前
springboot雅集社区养老管理系统04456-计算机课程设计、毕业设计
vue.js·spring boot·python·mysql·typescript·spark·django
知守观35 分钟前
Spring Boot 2.1.0 停维护5年,10个依赖4个有CVE——2022年老项目的安全体检报告
spring boot·后端
FYKJ_201035 分钟前
express皖美特色农产品网售系统53118-计算机课程设计、毕业设计
javascript·vue.js·spring boot·mysql·typescript·spark·express
SimonKing38 分钟前
SSE项目`nexus-sse`持续优化,不一样的视觉效果
java·后端·程序员