Spring MVC源码分析

本文详细介绍了MVC中的Model1和Model2模型,重点讲解了SpringMVC的执行流程,从请求到达前端控制器,经过处理器映射器、处理器适配器,再到视图解析,最后成功响应请求。通过对源码的分析,清晰地展示了SpringMVC的工作原理。

1、MVC模型

1.1、Model1模型

在这里插入图片描述
Model1模型是很早以前开发项目的一种常见模型,项目主要由JSP和Java和Bean两部分组成。在Model1模型下,整个WEB应用几乎都由JSP页面组成,JSP页面负责接收客户端请求,对请求处理后直接做出下响应。用少量的JavaBean来处理数据库连接、数据库访问等操作。
优点: 结构简单,开发小型项目效率高。
缺点:

  1. JSP的职责兼顾展示数据和处理数据(也就是干了控制器和视图的事)
  2. 所有逻辑代码都写在JSP里面,导致代码重用性很低
  3. 由于展示数据的代码和处理业务的代码混在一起,维护非常不方便
    这种模型已经被淘汰没人使用。

1.2、Model2模型

Model2模型是在Model1的基础上进行改良,是MVC模型的一个经典应用。把处理请求和展示数据进行了分离,让每部分各司其职。
此时的JSP已经是单纯的展示数据了,而处理请求的事情交给了控制器来完成,使得每个组件充分独立,提高了代码的可重用性和易维护性。
在这里插入图片描述
Model2是基于MVC架构的设计模式。
Servlet作为前端控制器,负责接收客户端发送的请求,在Servlet中只包含控制逻辑和简单的前端处理;
JavaBean后端来完成实际的逻辑处理;
JSP最后负责页面处理显示逻辑。
Model2具有组件化的特点,也是现在用的比较多的模型,更实用于大规模应用的开发。

2、基于MVC模型架构指:SpringMVC

执行流程图解:
在这里插入图片描述

2.1、源码分析

下面我们来调试一遍源码,看怎么和上面的流程图对应起来。

  1. 首先是请求到前端控制器
    Ctrl+n搜索到前端控制器处理类:
    在这里插入图片描述
    找到doService方法:
    在这里插入图片描述
    方法里面往下找doDispatch应该就是处理请求的关键地方了,这里我们加个断点,方便调试:
    在这里插入图片描述
    对应流程图的部分:
    在这里插入图片描述

  2. 处理器映射器
    进到doDispatch方法:
    在这里插入图片描述
    往下走,可以看到一个方法getHandler,这个就是获取执行链的方法,即处理器映射器,getHandler方法返回的对象mappedHandler就是一个执行链对象HandlerExecutionChain:
    在这里插入图片描述
    进到getHandler方法,执行后可以看到,获取到的就是配置的执行方法,因为这里没有配置拦截器,所以只有处理方法:
    在这里插入图片描述
    对应流程图部分:
    在这里插入图片描述

  3. 处理器适配器
    继续往下走,可以看到getHandlerAdapter,其实命名都是很规范的,一看就知道是什么意思:
    在这里插入图片描述
    进到可以看到和springmvc.xml配置的一样,根据SimpleControllerHandlerAdapter过滤适配器:
    在这里插入图片描述
    对应流程图部分:
    在这里插入图片描述

  4. 视图解释器
    获取完处理器适配器后继续往下走,看到applyPreHandle:
    在这里插入图片描述
    这个是拦截器的处理方法,我们先不管它,继续往下走:
    在这里插入图片描述
    这个就是返回视图的方法了,进入handle查看下:
    在这里插入图片描述
    原来是一个接口,按住Ctrl+A+b,选择SimpleControllerHandlerAdapter,因为我们配置文件配置的是这个适配器:
    在这里插入图片描述
    在这里插入图片描述
    进来后看到handle方法其实就一行代码,将处理器传进来,获取到ModelAndView,断点继续走其实就是进入我们的方法,获取视图信息:
    在这里插入图片描述
    执行完后返回的视图信息:
    在这里插入图片描述
    流程对应部分:
    在这里插入图片描述
    往下走还有一个applyPostHandle,这个也是拦截器的处理方法:
    在这里插入图片描述

  5. 视图解析
    获取到ModelAndView后,还要将ModelAndView信息解析到view对象,继续往下执行到processDispatchResult,从名字看就是处理结果的:
    在这里插入图片描述
    进入processDispatchResult方法里面,看到有一段代码,mv不等于null的时候,就会render视图对象:
    在这里插入图片描述
    继续进入render:
    在这里插入图片描述
    在这里插入图片描述
    对应流程部分:
    在这里插入图片描述

继续进入上图的render:
在这里插入图片描述
进入renderMergedOutputModel,这里就获取到了视图解析完后,跳转到哪个页面:
在这里插入图片描述
往下走就是具体用那种跳转方式:
在这里插入图片描述
对应流程部分:
在这里插入图片描述
最后成功响应请求。

以上就是SpringMVC执行流程的图形剖析和源码分析过程。

### Spring MVC 框架源码详细分析及工作流程解析 #### 1. Spring MVC 架构概述 Spring MVC 是一种基于 Java 的 Web 开发框架,采用了经典的 Model-View-Controller (MVC) 设计模式。这种设计模式将应用程序分为三个主要部分:模型(Model),视图(View),和控制器(Controller)[^1]。 - **模型 (Model)** 负责管理应用的核心数据及其逻辑。 - **视图 (View)** 负责呈现用户界面并显示来自模型的数据。 - **控制器 (Controller)** 接收用户的输入并将这些输入转换成命令传递给模型或视图。 #### 2. 核心组件剖析 ##### 2.1 `DispatcherServlet` 类 作为整个 Spring MVC 请求处理的入口点,`DispatcherServlet` 承担着核心职责。它是 Servlet 容器中的一个标准 Servlet 实现,在接收到 HTTP 请求后会将其分派到相应的处理器上[^1]。 以下是 `DispatcherServlet` 的几个关键功能: - 解析 URL 并找到匹配的 Handler 映射; - 使用适配器机制调用具体的 Controller 方法; - 将响应结果渲染至客户端。 ```java public class DispatcherServlet extends FrameworkServlet { @Override protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception { HttpServletRequest processedRequest = checkAndPrepare(request); // 获取 handler execution chain HandlerExecutionChain mappedHandler = getHandler(processedRequest); if (mappedHandler != null) { try { mv = ha.handle(processedRequest, response, mappedHandler.getHandler()); processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException); } finally { triggerAfterCompletion(processedRequest, response, mappedHandler, webRequest, dispatchException); } } } } ``` ##### 2.2 多部件解析器 (`MultipartResolver`) 为了支持文件上传等功能,Spring MVC 提供了一个名为 `MultipartResolver` 的接口来解析 multipart 表单提交的内容。此解析器通常会在初始化阶段按 ID 注册到容器中以便后续使用[^2]。 #### 3. 请求处理流程详解 下面是对 Spring MVC 请求处理过程的一个逐步分解: 1. 当用户发起请求时,该请求会被转发给前端控制器——`DispatcherServlet`。 2. 随后,`DispatcherServlet` 对请求 URI 进行拆解,并尝试查找与之关联的具体处理器(Handler)[^3]。 3. 如果找到了合适的处理器,则进一步寻找适合它的 Adapter 来完成实际操作。 4. 在真正执行目标方法之前,允许一系列预定义好的拦截器介入其中以实施必要的前置动作。 5. 参数绑定完成后进入真正的业务逻辑处理环节;在此期间可能会涉及数据库访问或其他外部服务交互。 6. 最终形成的结果集需经过视图解析器转化为最终形式反馈给用户端。 #### 4. 总结 通过对上述内容的学习可以发现,Spring MVC 不仅提供了强大的灵活性还保持了良好的可维护性和扩展能力。无论是简单的 CRUD 应用还是复杂的分布式系统都能从中受益匪浅。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alinlx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值