Spring MVC源码分析

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执行流程的图形剖析和源码分析过程。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Spring MVC源码包括多个组件和类。其中,Tomcat在启动时会通知Spring初始化容器,加载bean的定义信息并初始化所有单例bean。然后,Spring MVC会遍历容器中的bean,获取每个controller中方法访问的URL,并将URL和Controller保存到一个Map中。这一过程是由HandlerMapping组件完成的,它是Spring MVC中负责URL到Controller映射的组件。此外,在Spring MVC源码中还有一个抽象类FrameworkServlet,它重写了初始化方法initServletBean(),可以在控制台或日志中打印初始化Servlet的名称以及初始化所需的时间。 以上是关于Spring MVC源码的一些重要信息,这些组件和类协同工作,实现了Spring MVC框架的核心功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Spring MVC源码分析](https://blog.csdn.net/qq_38826019/article/details/117877511)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [SpringMVC源码解析](https://blog.csdn.net/qq_35512802/article/details/120659719)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Alinlx

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

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

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

打赏作者

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

抵扣说明:

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

余额充值