首页 > 其他分享 >梳理DispatcherServlet核心功能!

梳理DispatcherServlet核心功能!

时间:2022-12-10 01:22:34浏览次数:39  
标签:HandlerMapping 请求 处理 核心 HandlerAdapter DispatcherServlet 方法 梳理

今天梳理一下DispatcherServlet的组成结构,了解其各个核心功能。

DispatcherServlet只是一个普通的Servlet,它也会接收Java Web服务器的requestresponse参数,从request中获取请求信息,向response返回响应信息。
DispatcherServlet也是一个特殊的Servlet,为了适用日常Web应用开发,它需要兼容各种情况的业务流程:

  1. 如果是个文件上传请求,它需要对文件输入流进行处理,并及时清除临时文件。
  2. 它需要映射请求地址和对应的处理方法。
  3. 它需要将HTTP请求参数解析成对应Java对象。
  4. 它需要校验请求参数的合法性。
  5. 它需要将响应Java对象解析成对应格式的HTTP响应。
  6. 它需要对异常进行统一处理。
  7. ……

DispatcherServlet的类图如下:

其中,每个成员变量集成了某种业务的功能,这些功能组合起来,能够支持绝大部分日常业务场景。
它还提供了多个扩展点,便于开发人员在业务流程中的某个节点进行扩展,增强Spring MVC功能以适应自己的系统。

MultipartResolver

MultipartResolver提供了文件上传业务的功能:

  1. 首先,它会对request参数进行校验,如果请求头Content-Typemultipart/开头,说明当前是文件上传请求。
  2. 如果是文件上传请求,DispatcherServlet会调用MultipartResolver成员变量,对文件请求进行处理。核心处理逻辑是,读取文件输入流,将文件临时保存到本地,然后将本地临时文件的信息封装成MultipartHttpServletRequest对象返回。开发人员在业务中读取到的实际上是本地临时文件,而不是网络中的文件二进制数据。
  3. 在业务处理完成后,DispatcherServlet还会调用MultipartResolver成员变量,及时将本地临时文件删除,避免资源浪费。

HandlerMapping

HandlerMapping提供了请求地址和对应处理方法的映射功能:

  1. 在项目启动时,HandlerMapping会对整个项目进行扫描,将开发人员定义的请求地址和处理方法一一对应,并且缓存起来。
  2. DispatcherServlet接收到请求时,会根据当前request的请求地址等信息,从HandlerMapping中获取对应的处理方法,便于后续调用。

DispatcherServlet持有HandlerMapping的列表,支持各种形式的请求地址-处理方法映射方式。例如@Controller就是最常使用的一种方式,对应的是RequestMappingHandlermapping
HandlerMapping除了保存请求地址和处理方法映射关系,它还会存储拦截器HandlerInterceptor列表。
拦截器类似于Filter,会在处理方法前进行预处理,在处理方法后进行后处理,会在请求完成后进行最后处理,是Spring MVC提供的一个增强点。
例如,跨域资源共享(CORS)功能,就可以通过拦截器进行实现。

HandlerAdapter

HandlerAdapterDispatcherServlet最核心的一个成员变量,它会实际调用开发人员定义的请求处理方法:

  1. 在项目启动时,HandlerAdapter会加载配置的参数解析器、返回值处理器、类型转换器等。
  2. HandlerMappingHandlerAdapter是一一对应的。当DispatcherServlet处理请求时,如果该请求地址-处理方法由某个HandlerMapping保存,会使用对应的HandlerAdapter进行处理。
    1. HandlerAdapter会对request进行预处理,比如将请求参数解析成对应处理方法的形参对象,对请求参数进行规则校验。
    2. HandlerAdapter会使用反射方式,传递解析后的参数进行调用处理方法。
    3. HandlerAdapter会按照定义好的HTTP响应格式,将处理方法返回的Java对象解析成对应的数据格式进行响应。

DispatcherServlet持有HandlerAdapter的列表,与HandlerMapping列表一一对应。例如@Controller使用的RequestMappingHandlermapping,对应的是RequestMappingHandlerAdapter
HandlerAdapter支持自定义参数解析器、返回值处理器、类型转换器等。例如@RequestBody@RequestParam@Validated@ResponseBody等注解,都是通过这些解析器/处理器/转换器进行实现的。

HandlerExceptionResolver

HandlerExceptionResolver提供了全局异常处理的功能:

  1. 在项目启动时,HandlerExceptionResolver会扫描整个项目,加载异常处理的处理方法。
  2. DispatcherServlet处理请求过程中,包括MultipartResolver文件处理、HandlerMapping获取请求处理方法、拦截器的方法执行、HandlerAdapter执行请求处理方法过程,只要抛出了异常,都会最终交由HandlerExceptionResolver进行全局异常处理。
  3. 如果HandlerExceptionResolver不能处理该异常,或者在处理异常过程中抛出了新异常,都会直接将异常返回给Java Web服务器。

DispatcherServlet持有HandlerExceptionResolver的列表,支持各种形式的全局异常处理方式。例如@ControllerAdvice就是最常使用的一种方式,对应的是ExceptionHandlerExceptionResolver

其他

以上介绍的是前后端分离模式下,所使用的核心功能。
DispatcherServlet还支持其他业务流程的支持,对应模块为:

  • LocaleResolver:国际化解析器。
  • ThemeResolver:主题解析器。
  • RequestToViewNameTranslator:请求-视图翻译器。
  • FlashMapManager:重定向管理器。
  • ViewResolver:视图解析器。
    这些模块只在特殊场景才会使用,这里不做过多介绍。以后有机会可以对这些模块进行详细说明。

今日小结

本文对DispatcherServlet的核心功能进行了简单的梳理,但是详细总结了各个核心功能的处理流程,对DispatcherServlet有了整体的概念,对后续深入学习有着重要的指导作用。

标签:HandlerMapping,请求,处理,核心,HandlerAdapter,DispatcherServlet,方法,梳理
From: https://www.cnblogs.com/Xianhuii/p/16970666.html

相关文章

  • 计算机网络体系结构快速梳理
    一、TCP/IP网络模型应用层负责在不同的应用层协议的约束下,如http、dns、ftp,通过应用进程间的交互来完成特定网络应用应用层只需要专注于为用户提供应用功能即可,无需关心......
  • 基于 ClickHouse OLAP 的生态:构建基于 ClickHouse 计算存储为核心的“批流一体”数仓
    概述本文关键词:■OLAP■Multidimensionalinformationsystems■Datawarehousing■Databases■Decisionsupportsystems(DSS)■Executiveinformationsystems(EI......
  • web.xml中配置dispatcherServlet(控制器)
    <!--配置DispatcherServlet--><servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-cl......
  • 浮点数理解梳理
     先说一下计算机中二进制的​​算法​​:· 整数 整数的二进制算法大家应该很熟悉,就是不断的除以2取余数,然后将余数倒序排列。比如求9的二进制: 9/2=4余1 4/2=2余0......
  • 数列知识总结梳理
    本篇文章重点梳理数列章节相关的知识,以及在求解数列相关问题时比较常用且能较好地简便计算的方法。有关等差数列与等比数列的内容本文主要是以给出性质为主,中点在于后两部......
  • springboot最核心的三个特有注解
    SpringBoot最大的特点是无需XML配置文件,能自动扫描包路径装载并注入对象,并能做到根据classpath下的jar包自动配置。所以SpringBoot最核心的3个注解就是:@Config......
  • jQuery再学习之一、jQuery核心
    前言     jQuery核心是最基础的jQuery对象,或者叫函数,有了它我们才可以进行其它的操作,所以,需要认真掌握。  jQuery核心函数1         获取jQuery对象(包装......
  • P5536 【XR-3】核心城市
     P5536【XR-3】核心城市考察:树的中心思维 码力/*P5536【XR-3】核心城市1.核心城市肯定包含中心,其他城市到达重心的距离就是最小值2.如果k>中个数,k<=1e53.......
  • 【Core Dump】核心转存 故障分析
    浏览关于coredump的文章时,下面两篇文章说的清晰易懂,转发下:https://blog.csdn.net/asdfghjkl0606/article/details/52841678https://blog.csdn.net/stpeace/article/detai......
  • 输入一个整数n<10 输入n+2行,如图的图形: 核心n行,周边被*号保卫
    n=input('');fori=1:n+1forj=1:n+2-ifprintf('');%输出左边的空格endfprintf('*');%输出左边的*号forj=1:2......