讲师中心 微信公众号

工具推荐

视频效率加速
updream

一键生成高质量推广成片

立刻MV
立刻MV

低成本歌曲 MV、视频生成

Seko
Seko

AI短剧一键生成成片

Laper
Laper

剧本策划到成片协作

Java面试之Spring MVC的请求执行流程

风静酱_8682

风静酱_8682

发布时间:2026-02-18 08:19:03

|

454人浏览过

|

来源于php中文网

原创

DispatcherServlet 由 Servlet 容器(如 Tomcat)根据配置自动触发,继承 HttpServlet,重写 doService() 启动 MVC 流程;Spring Boot 默认注册,路径为 /。

java面试之spring mvc的请求执行流程

DispatcherServlet 是怎么被触发的

Spring MVC 的整个请求流程起点是 DispatcherServlet,它不是你手动调用的,而是由 Servlet 容器(比如 Tomcat)在收到 HTTP 请求后,根据 web.xml 或基于 Java Config 的 ServletRegistrationBean 配置,把请求派发给它。

关键点在于:这个类继承自 HttpServlet,所以最终走的是 service() → doGet()/doPost() 这条链。Spring 重写了 doService() 方法,在里面封装了真正的 MVC 流程入口。

  • 如果你用的是 Spring Boot,默认已自动注册 DispatcherServlet,路径为 /,不需要手动配 web.xml
  • 老项目若在 web.xml 中配置了 url-pattern 为 /,注意它会覆盖掉容器默认的静态资源处理;加个 <init-param><param-name>dispatchOptionsRequest</param-name><param-value>true</param-value></init-param> 才能支持 OPTIONS 预检
  • Spring Boot 2.6+ 默认禁用 /resources/** 等静态路径映射,如果发现 CSS/JS 404,要检查是否误删了 WebMvcConfigurer 中对 addResourceHandlers() 的配置

HandlerMapping 怎么找到对应 Controller 方法

当 DispatcherServlet 收到请求后,第一件事是查 HandlerMapping,也就是“谁来处理这个 URL”。它不只看路径,还会结合 HTTP 方法、请求头(如 Content-Type)、参数(@RequestParam)、甚至自定义条件(@RequestMapping(params = "format=json"))。

常见实现有 RequestMappingHandlerMapping(处理 @Controller + @RequestMapping),它内部维护了一个 mappingRegistry,把每个 HandlerMethod 和匹配条件缓存起来。

立即学习“Java免费学习笔记(深入)”;

Java调试
Java调试

通过 JDWP 实现 Java 远程调试:连接远程 JVM、设置断点、单步执行代码、查看变量值、获取调用栈。适用于需要调试远程 Java 应用、排查运行时状态、追踪代码执行流程的场景。 术语注解 JDWP:Java Debug Wire Protocol,Java 调试有线协议(Java 远程调试底层通信协议) remote JVM:远程 Java 虚拟机 step through code:代码单步调试(步入 / 步过 / 步出调试) inspect variables:变量查看 / 变量检视 stac

下载
  • 多个 @RequestMapping 值写成数组形式:@RequestMapping({"/user", "/api/user"}),等价于两个独立映射
  • 路径变量 {id} 和通配符 ** 会影响匹配优先级:精确路径 > 路径变量 > 通配符;/user/123 会优先匹配 @GetMapping("/user/{id}") 而不是 @GetMapping("/user/**")
  • 如果出现 No mapping for GET /xxx 错误,先确认 Controller 类是否加了 @Controller(或 @RestController),再确认包是否被 @ComponentScan 扫描到

HandlerAdapter 如何执行 Controller 方法并返回 ModelAndView

找到 HandlerMethod 后,DispatcherServlet 会委托给 HandlerAdapter 来真正调用它。最常用的是 RequestMappingHandlerAdapter,它负责解析参数(@PathVariable、@RequestBody、@ModelAttribute 等)、调用方法、处理返回值。

返回值类型决定后续流程:String 视为逻辑视图名,ModelAndView 包含视图和模型数据,@ResponseBody 注解的方法则跳过视图解析,直接写响应体。

  • @RequestBody 要求请求头带 Content-Type: application/json,否则会报 HttpMessageNotReadableException
  • @ModelAttribute 参数如果没在请求中提供,会尝试调用无参构造函数创建实例;若类没有无参构造,会抛 InstantiationException
  • 返回 void 且没加 @ResponseBody,Spring 会尝试用请求路径推断视图名(如 /user/list → user/list),但容易出错,建议显式返回 String 或加注解

ViewResolver 怎么把逻辑名转成真实页面

只有返回值是逻辑视图名(如 "user/detail")时,才会走到 ViewResolver。它不负责渲染,只是把名字拼装成真实路径,比如加上前缀 /WEB-INF/views/ 和后缀 .jsp,然后交给 InternalResourceView 去 RequestDispatcher.forward()。

Spring Boot 默认使用 ThymeleafViewResolver 或 InternalResourceViewResolver(JSP 场景),但要注意 JSP 在嵌入式 Tomcat 中默认不可用 —— 因为 spring-boot-starter-tomcat 是 provided 作用域,不会打包 JSP 编译器。

  • Thymeleaf 模板默认路径是 classpath:/templates/,后缀是 .html;改配置要动 spring.thymeleaf.prefix 和 suffix
  • 用 redirect: 或 forward: 开头的字符串会绕过 ViewResolver,直接交由 Servlet 容器处理重定向或转发
  • 如果页面打开空白但控制台没报错,先检查浏览器是否收到 200 但响应体为空 —— 很可能是 ViewResolver 拼出来的路径根本不存在,又没配 defaultView,导致静默失败

整个流程里最容易被忽略的是组件初始化顺序和 Bean 加载时机:比如自定义 HandlerExceptionResolver 必须在 DispatcherServlet 初始化完成前注册,否则 500 错误可能进不了你的全局异常处理器;还有 @InitBinder 方法只对当前 Controller 生效,跨 Controller 复用得靠 @ControllerAdvice。

热门AI工具

更多
Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

函子Zion

一款支持AI搭建、可视化编辑和多端发布的全栈无代码开发平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

更多
如何配置Tomcat环境变量
如何配置Tomcat环境变量

配置Tomcat环境变量需要在系统中添加CATALINA_HOME变量,并将Tomcat的安装路径添加到PATH变量中。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

965

2023.10.26

idea如何集成Tomcat
idea如何集成Tomcat

idea集成Tomcat的步骤:1、添加Tomcat服务器配置;2、配置项目部署;3、运行Tomcat服务器;4、访问项目;5、注意事项;6、关闭Tomcat服务器。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

324

2024.02.23

怎么查看Tomcat源代码
怎么查看Tomcat源代码

查看Tomcat源代码的步骤:1、下载Tomcat源代码;2、在IDEA中导入Tomcat源代码;3、查看源代码;4、理解Tomcat的工作原理;5、参与社区和贡献;6、注意事项;7、持续学习和更新;8、使用工具和插件。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

509

2024.02.23

常见的tomcat漏洞有哪些
常见的tomcat漏洞有哪些

常见的tomcat漏洞有:1、跨站脚本攻击;2、跨站请求伪造;3、目录遍历漏洞;4、缓冲区溢出漏洞;5、配置漏洞;6、第三方组件漏洞。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

305

2024.02.23

tomcat日志乱码怎么解决
tomcat日志乱码怎么解决

tomcat日志乱码的解决办法:1、修改tomcat的日志编码设置;2、检查ide的编码设置;3、检查操作系统的编码设置;4、使用过滤器处理日志;5、检查外部系统的编码设置;6、检查文件编码方式等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

348

2024.02.23

weblogic和tomcat有哪些区别
weblogic和tomcat有哪些区别

weblogic和tomcat的区别:1、功能;2、性能;3、规模;4、价格;5、安全性;6、配置和管理;7、社区支持;8、集成能力;9、升级和更新;10、可靠性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

349

2024.02.23

tomcat和nginx有哪些区别
tomcat和nginx有哪些区别

tomcat和nginx的区别:1、应用领域;2、性能;3、功能;4、配置;5、安全性;6、扩展性;7、部署复杂性;8、社区支持;9、成本;10、日志管理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

601

2024.02.23

tomcat启动闪退怎么解决
tomcat启动闪退怎么解决

tomcat启动闪退的解决办法:1、检查java环境;2、检查环境变量配置;3、检查端口被占用;4、检查配置文件编码;5、检查启动时需要的配置文件;6、检查相关文件是否丢失;7、检查防火墙和杀毒软件设置。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

322

2024.02.23

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

40

2026.11.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn