Spring MVC请求处理流程和九大组件介绍

2021-09-16 0 By admin
Spring MVC 请求处理流程图
Spring MVC 请求处理流程图
  • 1:DispatcherServlet 是 SpringMVC 中的前端控制器(Front Controller),负责接收 Request并将 Request 转发给对应的处理组件.
  • 2:HandlerMapping 是 SpringMVC 中完成 url 到 Controller 映射的组件.DispatcherServlet接收 Request,然后从 HandlerMapping 查找处理 Request 的 Controller.
  • 3:Cntroller 处理 Request,并返回 ModelAndView 对象,Controller 是 SpringMVC 中负责处理 Request 的组件(类似于 Struts2 中的 Action),ModelAndView 是封装结果视图的组件.
  • 4 5 6:视图解析器解析 ModelAndView 对象并返回对应的视图给客户端。

一、请求URL和处理方法的对应关系

容器初始化时会建立所有 url 和Controller 中的Method 的对应关系,保存到HandlerMapping 中,用户请求是根据请求的url 快速定位到Controller 中的某个方法;在Spring 中先将url 和Controller 的对应关系,保存到Map<url,Controller>中。

1.1、详述

  1. Web 容器启动时会通知 Spring 初始化容器(加载Bean 的定义信息和初始化所有单例Bean);然后SpringMVC 会遍历容器中的Bean,获取每一个Controller 中的所有方法访问的url,然后将url 和Controller 保存到一个Map中。
  2. 这样就可以根据Request 快速定位到Controller,因为最终处理Request 的是Controller 中的方法,Map 中只保留了url 和Controller 中的对应关系,所以要根据Request 的url 进一步确认Controller 中的Method,这一步工作的原理就是拼接Controller 的url(Controller 上@RequestMapping 的值) 和方法的url(Method 上@RequestMapping 的值)。
  3. 与request 的url 进行匹配,找到匹配的那个方法;确定处理请求的Method 后,接下来的任务就是参数绑定,把Request 中参数绑定到方法的形式参数上,这一步是整个请求处理过程中最复杂的一个步骤。

二、Spring MVC 九大组件

2.1、HandlerMapping(处理器映射器)

HandlerMapping 是用来查找 Handler 的,也就是处理器,具体的表现形式可以是类,也可以是方法。
比如,标注了@RequestMapping的每个方法都可以看成是一个Handler。
Handler负责具体实际的请求处理,在请求到达后,HandlerMapping 的作用便是找到请求相应的处理器 Handler 和 Interceptor。

2.2、HandlerAdapter(处理器适配器)

HandlerAdapter 是一个适配器。因为 Spring MVC 中 Handler 可以是任意形式的,只要能处理请求即可。
但是把请求交给 Servlet 的时候,由于 Servlet 的方法结构都是 doService(HttpServletRequest req,HttpServletResponse resp)形式的,要让固定的 Servlet 处理方法调用 Handler 来进行处理,便是 HandlerAdapter 的职责。

2.3、HandlerExceptionResolver(异常处理器)

HandlerExceptionResolver 用于处理 Handler 产生的异常情况。它的作用是根据异常设置ModelAndView,之后交给渲染方法进行渲染,渲染方法会将 ModelAndView 渲染成页面。
不过要注意,HandlerExceptionResolver 只用于解析对请求做处理处理阶段产生的异常,渲染阶段的异常不归它管,这也是 SpringMVC 组件设计的一大原则–分工明确、互不干涉。

2.4、ViewResolver(页面渲染处理器)

ViewResolver即视图解析器,通常在 SpringMVC 的配置文件中,都会配上一个实现类来进行视图的解析。
用于将String类型的视图名和Locale解析为View类型的视图,只有一个resolveViewName()方法。
从方法的定义可以看出,Controller层返回的String类型视图名 viewName 最终会在这里被解析成为View。
View是用来渲染页面的,也就是说,它会将程序返回的参数和数据填入模板中,生成html文件。
ViewResolver 在这个过程主要完成两件事情: ViewResolver 找到渲染所用的模板(第一件大事)和所用的技术(第二件大事,其实也就是找到 视图的类型,如JSP)并填入参数。
默认情况下,Spring MVC会自动为我们配置一个 InternalResourceViewResolver,是针对 JSP 类型视图的。

2.5、RequestToViewNameTranslator(视图名称翻译器)

RequestToViewNameTranslator 组件的作用是从请求中获取 ViewName。
因为 ViewResolver 根据 ViewName 查找 View,但有的 Handler 处理完成之后,没有设置 View,也没有设置 ViewName,便要通过这个组件从请求中查找 ViewName。

2.6、LocaleResolver(当前环境处理器)

ViewResolver 组件的 resolveViewName() 方法需要两个参数,一个是视图名,一个是 Locale。
LocaleResolver 用于从请求中解析出 Locale,比如中国 Locale 是 zh-CN,用来表示一个区域。这个组件也是 i18n 的基础。

2.7、ThemeResolver(主题处理器)

ThemeResolver 组件是用来解析主题的。主题是样式、图片及它们所形成的显示效果的集合。
Spring MVC 中一套主题对应一个 properties文件,里面存放着与当前主题相关的所有资源,如图 片、CSS样式等。
创建主题非常简单,只需准备好资源,然后新建一个“主题名.properties”并将资 源设置进去,放在classpath下,之后便可以页⻚面中使用了。
SpringMVC中与主题相关的类有 ThemeResolver、ThemeSource和Theme。ThemeResolver负责从请求中解析出主题名, ThemeSource根据主题名找到具体的主题,其抽象也就是Theme,可以通过Theme来获取主题和具体的资源。

2.8、MultipartResolver(文件处理器)

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

2.9、FlashMapManager(参数传递管理器)

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

 

SpringMVC 请求处理流程扩展