SpringMVC介绍

spring内部组件流程

请求从用户发起,经过 DispatcherServlet(CEO)协调各组件,最终完成处理并返回视图

  1. 用户发起请求

  2. DispatcherServlet 它是 SpringMVC 的前端控制器,所有请求都先到这里,是整个流程的 "总指挥"。

  3. HandlerMapping DispatcherServlet 会先找 HandlerMapping,它的作用是根据请求路径(比如/user/login),找到对应的 Controller 方法(比如login())。

  4. HandlerAdapter 它是 "适配器",负责处理参数和响应的适配: 把请求中的原始参数(比如用户名)转换成 Controller 方法需要的格式(比如String username); 把 Controller 返回的结果(比如return login)封装成响应数据。

  5. Controller → Service → Dao Controller 调用 Service 层,Service 再调用 Dao 层(操作数据库,比如校验用户名密码),完成业务逻辑后,返回结果(比如return login)。

  6. ViewResolver Controller 返回的结果(比如login)会被 DispatcherServlet 传给 ViewResolver(视图解析器); 它根据前缀(比如/web-inf/html/)+ 返回值(login)+ 后缀(.html),拼接出最终的视图路径(比如/web-inf/html/login.html)。

  7. 返回视图给用户 VewResolver 找到对应的login.html页面,DispatcherServlet 将页面返回给用户,完成整个请求流程。

简单总结流程:用户请求 → DispatcherServlet → HandlerMapping(找 Controller 方法)→ HandlerAdapter(适配参数 / 响应)→ Controller/Service/Dao(业务处理)→ ViewResolver(解析视图路径)→ 返回视图给用户。

补充:

  1. 关于 HandlerAdapter 的返回值处理

    • 你提到了 HandlerAdapter 负责参数转换(入参),这很对。

    • 其实它还负责返回值处理 (出参)。Controller 方法执行完后返回的对象(比如 String "success"User 对象),也是由 HandlerAdapter 调用相应的 ReturnValueHandler 来处理的。

    • 如果是字符串 :它会把字符串传给 ViewResolver

    • 如果是对象(@RestController) :它会直接调用 HttpMessageConverter 转成 JSON 返回,跳过 ViewResolver

  2. 关于 ViewResolver 的适用范围

    • 你的流程描述的是传统的 服务端渲染(SSR) 模式(如 JSP, Thymeleaf)。

    • 在现代前后端分离架构中(Vue/React + Spring Boot),Controller 通常标注 @RestController 或直接返回对象。此时,数据会被直接序列化为 JSON,不会经过 ViewResolver ,而是直接通过 HttpMessageConverter 写给前端。

    • 修正后的通用流程... -> Controller -> Service -> Dao -> (判断返回类型) -> [若是页面: ViewResolver] / [若是数据: MessageConverter] -> 响应给用户

springmvc 作用

spring mvc框架主要用在控制层,控制层做的事情有: 1、接收前端参数 2、调用业务逻辑 3、响应前端数据 而spring mvc做的事情就是简化接受前端参数,和简化响应前端数据

总结

1、本文介绍了前端返送请求,后端的处理路程:用户发送请求到DispatcherServlet(前端控制器),再通过HandlerMapping根据请求路径找到对应的Controller 方法,再通过HandlerAdapter进行原始参数格式到目标参数格式的转换,Controller → Service → Dao执行任务后再通过ViewResolver拼接出最终的视图路径,返回视图给用户。 这里略微需要两点补充: 关于 HandlerAdapter 的返回值处理和关于 ViewResolver 的适用范围 。

2、又介绍了SpringMVC的作用。

相关推荐
karry_k3 小时前
MyBatis批量insert-select踩坑:useGeneratedKeys=true 可能让PostgreSQL返回大量插入结果
java·后端
karry_k3 小时前
PostgreSQL 在 MyBatis 中执行正常 SQL 失效:一次 DELETE USING 踩坑记录
java·后端
SamDeepThinking7 小时前
从源码到代码:MyBatis-Flex 与 MyBatis-Plus 的逐项对比
java·后端·程序员
她的男孩10 小时前
Spring Boot 接 Flowable 工作流:用 3 个注解搭一个请假审批流程
java·后端·架构
荣码12 小时前
LLM结构化输出:让AI返回JSON而不是废话,我踩了4个坑
java·python
plainGeekDev13 小时前
Gson → kotlinx.serialization
android·java·kotlin
小bo波1 天前
Java Swing 图形用户界面实验 —— 从算术练习到游戏开发的完整实践
java·课程设计·gui·游戏开发·扫雷·swing
咖啡八杯1 天前
GoF设计模式——备忘录模式
java·后端·spring·设计模式