SpringMVC执行流程

125 阅读4分钟

这是我参与「掘金日新计划 · 4 月更文挑战」的第 1 天,活动详情:juejin.cn/post/721806…

springmvc

首先我们把他拆开,需要先了解什么是spring,什么是mvc从而了解什么是springmvc

spring

spring是一个轻量级的开源框架,是为解决企业应用开发的复杂性而创建的,是一个三层架构,也为J2EE应用程序开发提供集成的框架。核心是控制反转(IoC)和面向切面编程(AOP)。

控制反转就是,一起创建对象,需要我们手动new,现在不需要了,我们把他交给spring。

aop其实是oop的补充,打比方,一个类里面同样实现两个方法的那一段,就是将那些影响到多个类的公共行为都封装到一个可重用模块,这就是AOP中的A (Aspect,切面,与业务无关,主要是减少代码的复用);

mvc

mvc包括三个单词,model,view,和controller

model表示模型层,可以看成是具体的实体类,比如学生类、图书类

view表示视图层,可以把他看成前端界面。比如jsp页面

controller控制层,负责连接model和view。接收用户请求,委托给模型进行处理(状态改变),处理完毕后把返回的模型数据返回给视图,由视图负责展示。也就是说控制器做了个调度员的工作。

最经典的就是jsp+servlet+javabean模式

image.png

什么是springmvc

就是指通过mvc三次架构的web框架。他是spring一个模块。 它以SpringIOC容器为基础,并利用容器的特性来简化它的配置,所以 SpringMVC 和 Spring 可直接整合使用,并且SpringMVC 对 MVC 流程进行了封装,屏蔽掉很多底层代码,让开发者可以更加轻松快捷的完成基于 MVC 模式的 Web 开发。

核心组件

前端控制器:接收请求、响应结果,相当于转发器, 处理器映射器:根据配置的映射规则(根据请求的URL),找到对应的处理器。 处理器适配器:适配调用具体的处理器,并且执行处理器中处理请求的方法,执行完毕之后返回一个ModelAndView对象。 处理器:controller代码。 视图解析器:会根据传递过来的ModelAndView对象进行视图解析,根据视图解析名解析真正的视图View。 视图:View是一个接口,它的实现类支持不同类型的视图。比如:JSP等等。

执行流程

  1. 用户点击某个请求路径,发起一个 HTTP request 请求,该请求会被提交到前端控制器(DispatcherServlet);
  2. 由 DispatcherServlet 请求一个或多个处理器映射器(HandlerMapping),并返回一个执行链(HandlerExecutionChn)。
  3. DispatcherServlet 将执行链返回的 Handler 信息发送给处理器适配器(HandlerAdapter);
  4. HandlerAdapter 根据 Handler 信息找到并执行相应的 Handler(常称为 Controller);
  5. Handler 执行完毕后会返回给 HandlerAdapter 一个 ModelAndView 对象(Spring MVC的底层对象,包括 Model 数据模型和 View 视图信息);
  6. HandlerAdapter 接收到 ModelAndView 对象后,将其返回给 DispatcherServlet ;
  7. DispatcherServlet 接收到 ModelAndView 对象后,会请求视图解析器(ViewResolver)对视图进行解析;
  8. ViewResolver 根据 View 信息匹配到相应的视图结果,并返回给 DispatcherServlet;
  9. DispatcherServlet 接收到具体的 View 视图后,进行视图渲染,将 Model 中的模型数据填充到 View 视图中的 request 域,生成最终的 View(视图);
  10. 视图负责将结果显示到浏览器(客户端)。

图示如下:

image.png

看上去好多,怎么记忆呢?

首先记忆mvc模式,用户点击请求,服务器调用Javabean模型,调用数据库进行相应处理。

那么第一步就是:(?)发送请求(?) 用户发送请求到浏览器(前端控制器)

那么前端控制器需要使用到controller层,在这里我们把他叫做hander,那么我们需要使用什么hander?以前我们需要自己写,现在因为spring特性,我们可以让spring处理,所以在中间需要进行查询,查询使用哪一个hander,查询所有hander的顺序

那么第二步就是 (?)查询(?) 前端控制器,查询处理器映射器,并返回一个hander执行链。

第三步:(?)匹配(?)前端控制器把执行链交给处理器映射器。

第四步:(?)找(?)处理器映射器找到相关hander进行执行

执行完成后在mvc下是返回响应,在这里我们需要发挥一个特殊的结果叫做modelandview的东西

第五步:(?)变成(?)处理器适配器把处理完成的hander结果变成modelandview

第六步:(?)转发modelandview(?)HandlerAdapter把modelandview返回给前端控制器

第七步:(?)解析modelandview 前端控制器寻找相关的视图解析器进行modelandview的解析

第八步:(?)拿到解析后的(?)前端控制器把解析后的model和view拿到

第九步:(?)寻找(?)前端控制器去寻找model填充view数据

第十步:(?)响应给客户端,视图把最后渲染的界面返回给用户

在这里第1,2,3,4,都是请求部分到controller的过程,第5,6,7,8,9,10是响应过程。