MVC九大组件初始化过程
1.MultipartResolver
org.springframework.web.servlet.DispatcherServlet#initMultipartResolver
初始化 MultipartResolver 这个对象用于处理文件上传的解析器
常用的 MultipartResolver 实现:
CommonsMultipartResolver
需要使用 Apache 的 commons-fileupload 等 jar 包支持,它能在比较旧的 servlet 版本中使用。(Spring 6.0 之后被移除了)
StandardServletMultipartResolver
基于Servlet {@ link jakarta.servlet.http.Part} API。作为 “multipartResolver” 只能在 Servlet 3 以上的版本使用
2.LocaleResolver
org.springframework.web.servlet.DispatcherServlet#initLocaleResolver
* 初始化 LocaleResolver 用于解析请求的地区信息 主要是国际化相关的
3.ThemeResolver
org.springframework.web.servlet.DispatcherServlet#initThemeResolver
* 初始化 ThemeResolver 用于解析请求的主题(Theme)
4.HandlerMapping
org.springframework.web.servlet.DispatcherServlet#initHandlerMappings
初始化 HandlerMapping 主要作用是根据请求的URL、请求参数、请求头等信息,确定请求应该由哪个处理器来处理。处理器可以是 Controller 类的方法、Servlet、甚至是其他类型的处理器。
MVC中默认的三个 HandlerMapping
在源码 org/springframework/web/servlet/DispatcherServlet.properties 中 org.springframework.web.servlet.HandlerMapping 定义了三个 HandlerMapping 实现类
- org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping
它支持Bean的名称前面加个 / 进行匹配, 例如 <bean id="/helloController" class="org.yang.learn.spring.mvc.HelloController"> </bean> 当一个Controller的Bean名称为”/helloController”时,它可以被映射到URL路径”/helloController”上
- org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping
这是一个基于注解的HandlerMapping实现,支持使用@RequestMapping等注解来定义请求映射。它能够扫描应用程序上下文中的所有@Controller和@RequestMapping注解,并将它们映射到相应的URL路径上。
- org.springframework.web.servlet.function.support.RouterFunctionMapping
这是一个基于函数式端点的 HandlerMapping 实现,引入自Spring WebFlux框架。它支持使用函数式编程的方式来定义请求路由和处理逻辑,通过RouterFunctions来定义路由规则,从而实现请求到处理器函数的映射。
MVC中实现Controller的方式
- 基于注解
使用Spring提供的注解(如@Controller、@RequestMapping、@GetMapping等)来定义控制器和处理方法。
- 实现 Controller 接口
实现org.springframework.web.servlet.mvc.Controller 接口,并实现其handleRequest方法
- 继承 AbstractController
继承 org.springframework.web.servlet.mvc.AbstractController 接口,并重写其handleRequestInternal方法
5.HandlerAdapter
org.springframework.web.servlet.DispatcherServlet#initHandlerAdapters
* 5.初始化 HandlerAdapter 用于调用请求处理器,并将请求数据传递给处理器。它负责将请求参数转换为处理器的方法参数,并调用相应的处理器方法。
MVC中常见的HandlerAdapter
- SimpleControllerHandlerAdapter:
这个适配器适用于实现了Controller接口的处理器。在Spring MVC的早期版本中,处理器通常是通过实现Controller接口来定义的。 它使用Controller接口的handleRequest方法来处理请求,并返回一个ModelAndView对象。
- HttpRequestHandlerAdapter:
适用于实现了HttpRequestHandler接口的处理器。HttpRequestHandler是一个更简单的接口,它只有一个handleRequest方法,该方法接受HttpServletRequest和HttpServletResponse对象。 这个适配器通常用于处理那些不返回ModelAndView对象,而是直接写响应到HttpServletResponse的情况。
- RequestMappingHandlerAdapter:
这是Spring MVC中最常用的适配器也是最复杂的
- 它支持基于注解的处理器,特别是使用了@RequestMapping注解的控制器方法。
- 支持多种类型的返回值,包括ModelAndView、String(视图名称)、void(默认的视图名称或直接写响应),以及使用@ResponseBody注解的响应体。
- 还支持数据绑定的自定义和转换器、验证器等。
6.HandlerExceptionResolver
org.springframework.web.servlet.DispatcherServlet#initHandlerExceptionResolvers
- 6.初始化 HandlerExceptionResolver 用于处理请求处理过程中产生的异常。它将异常转换为适当的响应,以便向客户端提供友好的错误信息。的视图名称。
7.RequestToViewNameTranslator
org.springframework.web.servlet.DispatcherServlet#initRequestToViewNameTranslator
* 7.初始化 RequestToViewNameTranslator 用于将请求转换为视图名称。当处理器方法没有显式地指定视图名称时,DispatcherServlet 会使用 RequestToViewNameTranslator 来确定适当的视图名称。
8.ViewResolver
org.springframework.web.servlet.DispatcherServlet#initViewResolvers
- 8.初始化 ViewResolver 用于根据视图名称解析出具体的视图对象。它负责将视图名称映射到实际的视图对象,以便渲染响应。
9.FlashMapManager
org.springframework.web.servlet.DispatcherServlet#initFlashMapManager
* 9.初始化 FlashMapManager 用于管理 Flash Map,Flash Map 是一种临时存储的数据结构,用于在请求重定向过程中传递数据。