Spring MVC源码分析

1、MVC模型

1.1、Model1模型

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

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

1.2、Model2模型

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

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

执行流程图解:
Spring MVC源码分析_第3张图片

2.1、源码分析

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

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

  2. 处理器映射器
    进到doDispatch方法:
    Spring MVC源码分析_第7张图片
    往下走,可以看到一个方法getHandler,这个就是获取执行链的方法,即处理器映射器,getHandler方法返回的对象mappedHandler就是一个执行链对象HandlerExecutionChain:
    Spring MVC源码分析_第8张图片
    进到getHandler方法,执行后可以看到,获取到的就是配置的执行方法,因为这里没有配置拦截器,所以只有处理方法:
    Spring MVC源码分析_第9张图片
    对应流程图部分:
    Spring MVC源码分析_第10张图片

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

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

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

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

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

你可能感兴趣的:(Spring,SpringMVC,spring,mvc)