一文读懂 spring MVC 请求处理流程

本文详细介绍了SpringMVC框架中的MultipartResolver、FlashMapManager等九大组件的作用,以及DispatcherServlet如何组织和处理请求,包括MVC设计模式、三层架构和请求处理流程。
摘要由CSDN通过智能技术生成
  • MultipartResolver

MultipartResolver ⽤于上传请求,通过将普通的请求包装成 MultipartHttpServletRequest 来实现。MultipartHttpServletRequest 可以通过 getFile() ⽅法 直接获得⽂件。如果上传多个⽂件,还可以调⽤ getFileMap()⽅法得到Map<FileName,File>这样的结构,MultipartResolver 的作⽤就是封装普通的请求,使其拥有⽂件上传的功能。

  • FlashMapManager

FlashMap ⽤于重定向时的参数传递,⽐如在处理⽤户订单时候,为了避免重复提交,可以处理完 post 请求之后重定向到⼀个 get 请求,这个 get 请求可以⽤来显示订单详情之类的信息。这样做虽然可以规避⽤户重新提交订单的问题,但是在这个⻚⾯上要显示订单的信息,这些数据从哪⾥来获得呢?因为重定向时么有传递参数这⼀功能的,如果不想把参数写进URL(不推荐),那么就可以通过 FlashMap 来传递。只需要在重定向之前将要传递的数据写⼊请求(可以通过 ServletRequestAttributes.getRequest()⽅法获得)的属性OUTPUT_FLASH_MAP_ATTRIBUTE 中,这样在重定向之后的Handler中Spring就会⾃动将其设置到Model中,在显示订单信息的⻚⾯上就可以直接从Model中获取数据。FlashMapManager 就是⽤来管理 FalshMap 的。

这九大组件都在 DispatcherServlet 类中。

/** MultipartResolver used by this servlet. */

// 多部件解析器

@Nullable

private MultipartResolver multipartResolver;

/** LocaleResolver used by this servlet. */

//地域解析器,国际化

@Nullable

private LocaleResolver localeResolver;

/** ThemeResolver used by this servlet. */

//主题解析器

@Nullable

private ThemeResolver themeResolver;

/** List of HandlerMappings used by this servlet. */

//处理器映射器组件

@Nullable

private List handlerMappings;

/** List of HandlerAdapters used by this servlet. */

//处理器适配器组件

@Nullable

private List handlerAdapters;

/** List of HandlerExceptionResolvers used by this servlet. */

//处理器异常解析器

@Nullable

private List handlerExceptionResolvers;

/** RequestToViewNameTranslator used by this servlet. */

//视图名称转换器

@Nullable

private RequestToViewNameTranslator viewNameTranslator;

/** FlashMapManager used by this servlet. */

//flash 组件管理器

@Nullable

private FlashMapManager flashMapManager;

/** List of ViewResolvers used by this servlet. */

//视图解析器

@Nullable

private List viewResolvers;

MVC 结构体系

=======================================================================

三层架构:表现层、业务层和持久层

MVC 设计模式:

MVC 全名是 Model View Controller,是 模型(model)-视图(view)-控制器(controller) 的缩写, 是⼀

种⽤于设计创建 Web 应⽤程序表现层的模式。MVC 中每个部分各司其职:

Model(模型):模型包含业务模型和数据模型,数据模型⽤于封装数据,业务模型⽤于处理业

务。

View(视图): 通常指的就是我们的 jsp 或者 html。作⽤⼀般就是展示数据的。通常视图是依据

模型数据创建的。

Controller(控制器): 是应⽤程序中处理⽤户交互的部分。作⽤⼀般就是处理程序逻辑的。

MVC提倡:每⼀层只编写⾃⼰的东⻄,不编写任何其他的代码;分层是为了解耦,解耦是为了维

护⽅便和分⼯协作。

spring MVC 请求处理流程

================================================================================

所有请求都会通过DispatcherServlet 来执行。

流程说明:

1、DispatcherServlet 接收到客户端发送的请求。

2、DispatcherServlet 收到请求调用HandlerMapping 处理器映射器。

3、HandleMapping 根据请求URL 找到对应的handler 以及处理器 拦截器,返回给DispatcherServlet

4、DispatcherServlet 根据handler 调用HanderAdapter 处理器适配器。

5、HandlerAdapter 根据handler 执行处理器,也就是我们controller层写的业务逻辑,并返回一个ModeAndView

6、HandlerAdapter 返回ModeAndView 给DispatcherServlet

7、DispatcherServlet 调用 ViewResolver 视图解析器来 来解析ModeAndView

8、ViewResolve 解析ModeAndView 并返回真正的view 给DispatcherServlet

9、DispatcherServlet 将得到的视图进行渲染,填充到request域中

10、返回给客户端响应结果。

springmvc 源码分析

=============================================================================

请求进来。先找HttpServlet.发现FrameworkServlet 重现了doGet()和doPost() 方法。所以会执行其中的方法。

image-20200610155343088

并且在FrameworkServlet 中实现了HttpServlet 的 doGet()和doPost() 方法。

image-20200610155417563

我们接着看FrameworkServlet 的doGet和doPost 方法都是调用其processRequest 方法。这个方法里面主要的调用DispatcherServlet中doService()方法。

image-20200610160254087

在DispatcherServlet 中的这个方法。会调用doDispatche() 方法执行。

image-20200610160509049

image-20200610160104711

所以整体的请求流程都在doDispatch() 方法中。

主要流程如下:

1、根据url 请求获取到handlerExecutorChina 对象,也就是获取到handler执行链对象,这个对象中包含执行的handler 和一个拦截器的集合。

image-20200611154006184

image-20200611154037844

2、根据这个handlerExecutorChina 执行链对象获取到对应的handlerAdapter handler适配器。

3、根据这个适配器,真正执行handler ,并且返回一个modeAndView 这里的handler 就是我们通常所有的controller 层的业务逻辑。

image-20200611154638816

4、根据获取到的modeAndView ,解析渲染页面并返回结果。

image-20200611160300399

这样整体核心流程就完了。只有这四步。其实和最开始的流程处理图是一样的。总结一下:先根据请求从handlermapping 中获取到handle ,然后通过handle 找到能处理该请求的 handlerAdapter ,通过handlerAdapter 执行真正的handler 也就是我们的业务代码,并返回一个 ModeAndView 。然后通过viewResolver 解析成view 返回给页面

九大组件初始化的流程


九大组件初始化是在 DispatcherServlet 中的onRefresh() 方法中。

image-20200611161600286

我们通过调用栈可以发现,是在applicationContext类中的refresh() 方法中执行的。这个方法我们很熟悉就是spring 框架的初始化流程执行的主要方法。在refresh() 方法中 完成的Bean 对象实例化流程之后,会执行事件发布。这样就来到了我们springmvc 初始化了。

这九大组件的初始化流程都是差不多的,我们来看下核心组件的HandlerMapping 组件的初始化。

先在ApplicationContext中查找所有HandlerMappings,包括祖先上下文 活着指定的名称还获取,如果获取不到,就会从默认的配置中获取handlermappings

image-20200611163342283

获取默认的handlermappings 主要是从defaultStrategies 中获取。

那defaultStrategies 数据是怎么来的呢?

可以看到这个Properties 是从DispatcherServlet.properties 配置文件来的。

image-20200611164132953

我们查看这个问价可以看到默认的配置信息,九大组件的默认配置信息都有。

获取Handler 流程


下面我们回到主流程,第一步,从handlermappingshandlerMappings 中获取对应的handler

image-20200611164923494

可以看到就是遍历handlerMappings 找到这个url 对应的handler 就完了。

获取handlerAdapter 流程


自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

最后,强调几点:

  • 1. 一定要谨慎对待写在简历上的东西,一定要对简历上的东西非常熟悉。因为一般情况下,面试官都是会根据你的简历来问的; 能有一个上得了台面的项目也非常重要,这很可能是面试官会大量发问的地方,所以在面试之前好好回顾一下自己所做的项目;
  • 2. 和面试官聊基础知识比如设计模式的使用、多线程的使用等等,可以结合具体的项目场景或者是自己在平时是如何使用的;
  • 3. 注意自己开源的Github项目,面试官可能会挖你的Github项目提问;

我个人觉得面试也像是一场全新的征程,失败和胜利都是平常之事。所以,劝各位不要因为面试失败而灰心、丧失斗志。也不要因为面试通过而沾沾自喜,等待你的将是更美好的未来,继续加油!

以上面试专题的答小编案整理成面试文档了,文档里有答案详解,以及其他一些大厂面试题目。

面试答案

三面头条+四面阿里+五面腾讯拿offer分享面经总结,最终入职阿里

三面头条+四面阿里+五面腾讯拿offer分享面经总结,最终入职阿里

三面头条+四面阿里+五面腾讯拿offer分享面经总结,最终入职阿里

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 3. 注意自己开源的Github项目,面试官可能会挖你的Github项目提问;

我个人觉得面试也像是一场全新的征程,失败和胜利都是平常之事。所以,劝各位不要因为面试失败而灰心、丧失斗志。也不要因为面试通过而沾沾自喜,等待你的将是更美好的未来,继续加油!

以上面试专题的答小编案整理成面试文档了,文档里有答案详解,以及其他一些大厂面试题目。

面试答案

[外链图片转存中…(img-SbRwJyjH-1713435411278)]

[外链图片转存中…(img-L7ygDtGw-1713435411278)]

[外链图片转存中…(img-R6pCuqqS-1713435411279)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 23
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值