Java-Spring入门指南(十三)SpringMVC基本概念与核心流程详解

Java-Spring入门指南(十三)SpringMVC核心流程


前言

  • 在前几篇博客中,我们深入学习了Spring的IOC(控制反转)与AOP(面向切面编程),掌握了如何通过Spring管理对象、解耦业务逻辑与通用增强逻辑。
  • 而在实际Web应用开发中,如何高效处理HTTP请求、组织页面与业务的交互是核心问题。
  • Spring MVC作为Spring家族专为Web层设计的框架,完美承接了Spring的核心优势,让Web开发变得更简洁、模块化。

我的个人主页,欢迎来阅读我的其他文章
https://blog.csdn.net/2402_83322742?spm=1011.2415.3001.5343

我的Java-Spring入门指南知识文章专栏
欢迎来阅读指出不足
https://blog.csdn.net/2402_83322742/category_13040333.html?spm=1001.2014.3001.5482


一、SpringMVC是什么?

Spring MVC 是 Spring Framework 中的一个Web层框架 ,基于经典的 MVC设计模式 (Model-View-Controller,模型-视图-控制器)实现,用于简化Java Web应用的请求处理与页面渲染流程。

(1)MVC设计模式的职责划分

  • Model(模型):封装业务数据与核心业务逻辑(通常由Service、Repository等组成,与Spring核心容器的Bean一致)。
  • View(视图):负责页面渲染(如JSP、Thymeleaf、HTML等,展示Model中的数据)。
  • Controller(控制器):作为请求的"入口",接收HTTP请求,调用Model处理业务,最终选择View返回响应。

(2)Spring MVC的核心价值

它并非重新发明MVC,而是以Spring的IOC容器为基础,为MVC各组件提供了更灵活的配置与更简洁的开发方式,让Web层与业务层(Service、DAO等)能无缝集成,同时通过"前端控制器+组件化分工"的设计,大幅简化了传统Servlet开发的复杂度。

二、为什么需要SpringMVC?

在Spring MVC出现前,Java Web开发主要依赖原生Servlet/JSPStruts2等框架,存在诸多问题:

1. 传统Servlet开发的痛点

  • 配置繁琐 :每个请求都需编写独立Servlet,配置web.xml<servlet><servlet-mapping>,当请求数量大时,配置爆炸式增长。
  • 代码耦合严重:Servlet中既要处理请求参数、又要调用业务逻辑、还要手动转发/重定向页面,职责不单一。
  • 视图与逻辑混杂:若用JSP+Scriptlet,Java代码与HTML页面高度混杂,维护性极差。

2. SpringMVC的优势

  • 集中式请求调度 :通过DispatcherServlet(前端控制器)统一接收所有请求,再分发给不同Controller,无需为每个请求单独配置。
  • 组件化分工清晰HandlerMapping(找Controller)、HandlerAdapter(执行Controller)、ViewResolver(解析视图)等组件各司其职,符合"高内聚、低耦合"。
  • 与Spring无缝集成:Spring MVC的Controller、Service等都可作为Spring Bean管理,直接享受IOC、AOP等特性。
  • 灵活的视图支持:不仅支持JSP,还能轻松集成Thymeleaf、Freemarker等模板引擎,甚至纯JSON接口(前后端分离场景)。

三、SpringMVC核心流程详解

通过一张图,我们能直观看到Spring MVC从"接收请求"到"返回响应"的全链路流程:

流程分步拆解

  1. 步骤1:HTTP请求到达前端控制器

    客户端(浏览器、APP等)发送HTTP请求,所有请求首先被DispatcherServlet拦截(需在web.xml中配置其为"前端控制器")。

  2. 步骤2-3:查找处理器(Handler)
    DispatcherServletHandlerMapping(处理器映射器)询问:"当前请求应该由哪个处理器(Controller方法)处理?"
    HandlerMapping根据请求的URL、请求方式(GET/POST等),匹配到对应的HandlerExecutionChain(处理器执行链,包含目标Controller方法及拦截器等)并返回。

  3. 步骤4-7:执行处理器(Controller)
    DispatcherServlet拿到HandlerExecutionChain后,通过HandlerAdapter(处理器适配器)调用具体的Controller方法。

    • Controller内部调用Service处理业务逻辑,Service再调用Repository操作数据库(如MySQL),同时可能与Model(封装数据的对象)交互。
    • Controller处理完业务后,将结果(如Model数据、视图名称)返回给HandlerAdapter,再由HandlerAdapter回传给DispatcherServlet
  4. 步骤8-12:解析与渲染视图
    DispatcherServletViewResolver(视图解析器)询问:"如何解析返回的视图名称?"
    ViewResolver根据配置(如前缀、后缀)找到对应的View(如JSP文件、Thymeleaf模板),DispatcherServlet再渲染View(填充Model数据),最终将完整的页面(或JSON数据)响应给客户端。

四、核心组件深度解析

Spring MVC的高效运行,依赖以下核心组件的协作:

1. DispatcherServlet

  • 作用:是整个Spring MVC的"大脑",统一接收所有HTTP请求,协调其他组件完成请求处理。
  • 类比:如同餐厅的"前台",所有顾客(请求)先找前台,再由前台安排服务员(Controller)、厨师(Service)、传菜员(ViewResolver)等分工。
  • 配置方式 :需在web.xml中配置(或Spring Boot自动配置),指定其拦截的请求路径(如/**.do)。

2. HandlerMapping

  • 作用:根据请求的URL、请求方法等信息,找到"哪个Controller的哪个方法"应该处理该请求。
  • 具体工作 :内部维护"请求路径 → Controller方法"的映射关系(可通过注解@RequestMapping、配置文件等方式定义)。
  • 类比 :如同"菜单-厨师"的映射表,前台(DispatcherServlet)问"顾客点了宫保鸡丁,该找哪个厨师?",HandlerMapping就返回对应的厨师(Controller方法)。

3. HandlerAdapter

  • 作用 :因为Controller的实现形式可能不同(如注解式Controller、实现特定接口的Controller),HandlerAdapter负责"适配"不同形式的Controller,调用其方法。
  • 类比:不同厨师(Controller)有不同的做菜习惯(实现方式),传菜员(HandlerAdapter)负责按照统一方式从厨师那里取菜(调用方法),再交给前台。

4. Controller

  • 作用:是业务逻辑的"入口",接收请求参数,调用Service处理业务,最终返回"逻辑视图名+Model数据"。
  • 实现方式 :最常用的是注解式Controller (如@Controller+@RequestMapping),也可实现Spring的Controller接口。

5. ViewResolver

  • 作用 :将Controller返回的"逻辑视图名"(如"hello")解析为"物理视图地址"(如/WEB-INF/views/hello.jsp)。

  • 配置示例 :在Spring配置文件中指定前缀、后缀:

    xml 复制代码
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/views/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

    此时,逻辑视图名"hello"会被解析为/WEB-INF/views/hello.jsp

6. Model

  • 作用:封装Controller处理后的数据,供View渲染时使用。
  • 形式 :可以是普通Java对象、MapModel接口等,Spring会自动将其数据传递到View中。

我的个人主页,欢迎来阅读我的其他文章
https://blog.csdn.net/2402_83322742?spm=1011.2415.3001.5343

我的Java-Spring入门指南知识文章专栏
欢迎来阅读指出不足
https://blog.csdn.net/2402_83322742/category_13040333.html?spm=1001.2014.3001.5482

|--------------------|
| 非常感谢您的阅读,喜欢的话记得三连哦 |

相关推荐
ccccczy_2 小时前
SpringCloudGateway:像城市交通指挥系统一样的微服务网关
java·springcloud·微服务网关·api网关·springcloudgateway
AI+程序员在路上2 小时前
QT6中QGraphicsView功能与应用
开发语言·c++·qt
hello 早上好2 小时前
深入理解 SPI:从定义到 Spring Boot 实践
java·spring boot·python
【上下求索】2 小时前
学习笔记092——Windows如何将 jar 包启动设置成系统服务
java·windows·笔记·学习·jar
vistaup3 小时前
android studio 无法运行java main()
android·java·android studio
liuyao_xianhui3 小时前
四数之和_优选算法(C++)双指针法总结
java·开发语言·c++·算法·leetcode·职场和发展
blank@l4 小时前
Python类和对象----实例属性,类属性(这是我理解类和对象最透彻的一次!!)
开发语言·python·python接口自动化基础·python类和对象·python实例属性·python类属性·类属性和实例属性的区别
超奇电子4 小时前
高斯包络调制正弦波的Python代码
开发语言·python
Siren_dream4 小时前
python进阶_Day2
开发语言·python