Spring之MVC模式(下)

126 阅读3分钟

「这是我参与2022首次更文挑战的第6天,活动详情查看:2022首次更文挑战

前言:昨天我们聊到了MVC模式基本介绍、使用和工作流程,今天我们来说一下他的底层是如何实现的,在了解他底层的同时我们先来了解一下他的重要组件。

SpringMVC的重要组件:

1、前端控制器DispatcherServlet

他是Spring MVC的入口函数用于接收请求和响应结果,相当于转发器和中央处理器。DispatcherServlet它减少了与其它组件之间的耦合度,降低了组件之间的耦合性,它是mvc模式中的Controller。DispatcherServlet是整个流程控制的重点,当用户请求到达前端控制器,它调用其它组件处理用户的请求。

2、处理器映射器HandlerMapping

他根据请求的url查找Handler。HandlerMapping根据用户请求找到对应的Handler即处理器(Controller),SpringMVC提供了不同的映射器实现不同的映射方式,例如:我们常见的实现接口方式,注解方式,配置文件方式等等。

3、处理器适配器HandlerAdapter

他是按照HandlerAdapter要求的规则去执行Handler,通过HandlerAdapter对处理器进行执行,通过扩展适配器可以对更多类型的处理器进行执行。

4、处理器Handler

他在编写Handler时按照HandlerAdapter的规则,这样适配器才可以去正确执行Handler,Handler是继前端控制器的后端控制器(DispatcherServlet),在DispatcherServlet的控制下Handler对具体的用户请求进行处理。由于Handler涉及到具体的用户业务请求,所以一般情况需要开发者据业务需求开发Handler。

5、视图解析器View resolver

他根据逻辑视图名解析成视图(view) View Resolver负责将处理结果生成View视图,View Resolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。 springmvc框架提供了很多的View视图类型,包括:jstlView、freemarkerView、pdfView等。 一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由工程师根据业务需求开发具体的页面。

6、视图View

View是一个接口,实现类支持不同的View类型(Freemarker、Jsp、HTML等等)

源码展示

image.png

  • MultipartResolver:解析多部分请求,以支持从HTML表单上传文件。
  • LocaleResolver: 解析Request中的语言标志参数或者head中的Accept-Language参数, 并将解析后的参数保存到指定的域中。
  • ThemeResolver:解决Web应用程序可以使用的主题,例如提供个性化布局。
  • HandlerMapping:用于handlers映射请求和一系列的对于拦截器的前处理和后处理,大部分用@Controller注解。
  • HandlerAdapter:帮助DispatcherServlet处理映射请求处理程序的适配器,而不用考虑实际调用的是 哪个处理程序。
  • HandlerExceptionResolver: 异常处理接口
  1. SimpleMappingExceptionResolver:通过配置文件进行异常处理。
  2. AnnotationMethodHandlerExceptionResolver:通过注解进行异常处理。
  • viewNameTranslator: 将请求的view名称翻译成bean名称
  • ViewResolver:解析View视图,会根据逻辑 View 查找实际的 View。
  1. UrlBasedViewResolver:通过配置文件,把一个视图名交给到一个View来处理。
  • FlashMapManager:存储并检索可用于将一个请求属性传递到另一个请求的input和output的FlashMap,通常用于重定向。

继承关系图:

image.png

补充:

image.png \

image.png
每个DispatcherServlet都拥有WebApplicationContext,它继承了ApplicationContext。WebApplicationContext包含了其上下文和Servlet实例之间共享的所有的基础框架beans。

总结:SpringMVC在使用的时候他的实际就是对Bean的进行处理,使其和对应的view进行挂钩。### 在这我祝大家,新春快乐,心想事成,身体健康,万事如意。