SpringMvc的执行流程

15 篇文章 0 订阅
11 篇文章 0 订阅

0. 前言

如果面试的时候面试官问到与 SpringMvc 相关的知识,SpringMvc 的执行流程是必问的,因为 SpringMvc 的执行流程是 SpringMvc 框架的核心部分

当然,面试官可能不会直接问 SpringMvc 的执行流程,而是问 SpringMvc 中有哪些重要的组件,这两个问题考察的内容都是相似的


SpringMvc 的执行流程分两种情况:

  1. 视图阶段:存在于比较老旧的项目(使用的是 JSP 、FreeMarker 等技术)
  2. 前后端分离阶段:基于接口开发,只需要响应数据即可(通常是响应 JSON 格式的数据)

1. 视图阶段

在这里插入图片描述

  • DispatcherServlet(前端控制器):相当于一个调度中心,所有的请求都要经过 DispatcherServlet ,DispatcherServlet 由 Tomcat 容器(Web 容器)初始化,当 DispatcherServlet 类被加载后,会继续加载一些组件类(HandlerMapping、HandlerAdaptor、ViewResolver)
  • HandlerMapping(处理器映射器):保存了请求的路径信息和 Handler(又名 Controller) 信息。例如,当前请求的路径为 /user/getByid/1 ,处理器映射器根据这个路径就能找到某一个 Controller ,Controller 中有某个方法与路径相匹配。请求路径信息和 Handler 信息存放在一个 Map 当中,Map 的 key 为路径,value 为类名和方法名,一个类可能会有多个方法,这个 Map 会记录所有的路径信息和 Handler 信息。当处理器解析完成之后,会返回处理器执行链给前端控制器,因为在执行某个信息前,有可能会出现拦截器,如果有拦截器,会先经过拦截器,再执行处理器中的某个方法
  • HandlerAdaptor(处理器适配器):找到具体的方法并执行,Handler(Controller) 执行结束之后,会将结果返回给 HandlerAdaptor ,是不是感觉有点麻烦呢,直接通过 DispatcherServlet 找到 Handler 中的某个方法并执行不就好了,为什么还要有处理器适配器呢?主要是因为处理器适配器中做了两件非常重要的事:处理参数和处理返回值
    • 处理参数:控制器中可能会有很多方法,每个方法上面都有不同的参数(id、实体类等) ,参数的形式和类型大部分都是不一样的,怎么接收呢?其实处理器适配器中有一系列的处理参数的类型转换器,有了这些类型转换器,方法就能正确地接收参数
    • 处理返回值:方法可以返回一个实体类、一个字符串、一个集合,还能返回 Model And View ,这些返回值是如何响应到前端的呢?其实也是由处理器适配器来完成的
  • ViewResolver(视图解析器):将逻辑视图转化为真正的视图,将数据模型填充到视图中后,将视图返回给前端控制器,最后展示给用户的就是一个带有数据的页面

整体流程:

  1. 用户发送的请求到前端控制器(DispatcherServlet)
  2. DispatcherServlet 收到请求后调用处理器映射器(HandlerMapping)
  3. HandlerMapping 找到具体的处理器,生成处理器对象及处理器拦截器,再一起返回给 DispatcherServlet
  4. DispatcherServet 调用处理器适配器(HandlerAdapter)
  5. HandlerAdapter 调用具体的处理器(Handler,也叫 Controller)
  6. Controller 执行完成返回 ModelAndView 对象
  7. HandlerAdapter 将 ModelAndView 返回绘 DispatcherServlet
  8. DispatcherServiet 将 ModelAndView 传给视图解析器(ViewReslover)
  9. ViewReslover 解析后返回具体视图(View)
  10. DispatcherServlet 根据 View 进行视图渲染(将模型数据填充至视图中)
  11. DispatcherServlet 响应用户的请求

2. 前后端分离阶段

在这里插入图片描述

前后端分离阶段执行流程的前面部分与视图阶段类似(因为前后端分离阶段没有视图,不需要返回 ModelAndView ),不同之处主要在处理器(Handler)部分,Handler 的方法上添加了 @ResponseBody 注解,添加 @ResponseBody 注解之后,会调用消息转换器(HttpMessageConverter)来将方法的返回结果转化为 JSON 格式的字符串,最后响应给前端


整体流程:

  1. 用户发送出请求到前端控制器(DispatcherServlet)
  2. DispatcherServlet 收到请求调用处理器映射器(HandlerMapping)
  3. HandlerMapping 找到具体的处理器,生成处理器对象及处理器拦截器,再一起返回给DispatcherServlet
  4. DispatcherServlet 调用处理器适配器(HandlerAdapter)
  5. HandlerAdapter 调用具体的处理器(Handler,也叫 Controller)
  6. 方法上添加 @ResponseBody 注解,通过 HttpMessageConverter 将返回结果转换为 JSON 格式的字符串,响应用户的请求
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

聂 可 以

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

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

打赏作者

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

抵扣说明:

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

余额充值