SpringMVC的九大组件
搭配这张转载的图使用更佳(SpringMVC工作原理图)
1.HandlerMapping(处理器映射器)
作用 : 寻找Handler(注解/配置文件/接口)
首先解释一下handler,handler代表实际可以处理请求的方法或者类,例如被注解@ResquestMapping所标记的方法,就可以看作一个Handler
作用 : HandlerMapping的主要作用是根据请求的资源uri来查找对应的handler
2. HandlerAdapter(处理器适配器)
作用 : 处理找到的Handler
在我们找到对应的Handler时,我们则要开始处理Handler,因为Handler的实现多种多样,所以对于Handler不同的内部结构需要进行一定的处理
1 public abstract interface HandlerAdapter 2 { 3 public abstract boolean supports(Object paramObject); 4 5 public abstract ModelAndView handle(HttpServletRequest paramHttpServletRequest, HttpServletResponse paramHttpServletResponse, Object paramObject) 6 throws Exception; 7 8 public abstract long getLastModified(HttpServletRequest paramHttpServletRequest, Object paramObject); 9 }
- supports方法:是判断该适配器是否支持这个HandlerMethod,就是当得到一个handler时,该接口子类该方法做判断(就是类似handler instanceof Controller的判断方式),用来得到适配这个handler的适配器子类。
- handle方法:用来执行控制器处理函数,获取ModelAndView 。就是根据该适配器调用规则执行handler方法
- getLastModified方法:处理响应请求,控制客户端的GET请求(如post请求不受影响)是否被真实响应还是直接响应为不修改(304),servlet的service方法根据getLastModified的返回值
- HttpRequestHandlerAdapter可以执行
HttpRequestHandler
类型的handler
- SimpleControllerHandlerAdapter可以执行
Servlet
类型的handler
- RequestMappingHandlerAdapter可以执行
Controller
类型的handler
3. HandlerExceptionResolver(异常处理器)
4. ViewResolver(页面渲染处理器)
作用 : 根据视图名(String类型)和Locale(语言环境),获得最终的View类型的视图.
View是用来渲染页面的,而ViewResolver所要做的就是找到渲染所用的模板和技术(页面类型)
- ModelAndView : 包含视图名称或视图对象以及一些模型属性
public interface ViewResolver { View resolveViewName(String viewName, Locale locale) throws Exception; }
该接口只有一个方法,通过view name 解析出View。同样Spring提供了丰富的ViewResolver实现用来解析不同的View
5. RequestToViewNameTranslator(视图名称翻译器)
作用 : 当没有ViewName时,从请求中解析获取视图名
有的Handler处理完后并没有设置View也没有设置ViewName时,需要从request获取ViewName,而如何从request中获取ViewName就是RequestToViewNameTranslator要做的事情了.
当 ModelAndView 对象不为null,但是它的 View 对象为null,则需要通过 RequestToViewNameTranslator 组件根据请求解析出一个默认的视图名称。
6. LocaleResolver(当前环境处理器)
作用 : 协助view的解析
View的解析需要两个参数,一个是视图名,另一个是Locale(语言环境).视图名是处理器返回的,而Locale是由LocaleResolver从request中解析得到.
这就相当于配置数据库的方言一样,有了这个就可以对不同区域的用户显示不同的结果。
SpringMVC主要有两个地方用到了Locale:
- 一是ViewResolver视图解析的时候;
- 二是用到国际化资源或者主题的时候。
public interface LocaleResolver { /** * 从请求中,解析出要使用的语言。例如,请求头的 "Accept-Language" */ Locale resolveLocale(HttpServletRequest request); /** * 设置请求所使用的语言 */ void setLocale(HttpServletRequest request, @Nullable HttpServletResponse response, @Nullable Locale locale); }
7.ThemeResolver(主题处理器)
作用 : 主题处理器用于解析主题,相当于解析系统的整体样式和风格.
SpringMVC的主题也支持国际化,同一个主题不同区域也可以显示不同的风格。
SpringMVC中跟主题相关的类有ThemeResolver、ThemeSource和Theme。主题是通过一系列资源来具体体现的,要得到一个主题的资源,首先要得到资源的名称,这是ThemeResolver的工作。然后通过主题名称找到对应的主题(可以理解为一个配置)文件,这是ThemeSource的工作。最后从主题中获取资源就可以了。
8.MultipartResolver(文件处理器)
作用 : 用于处理上传请求。处理方法是将普通的request包装成MultipartHttpServletRequest,后者可以直接调用getFile方法获取File,如果上传多个文件,还可以调用getFileMap得到FileName->File结构的Map。此组件中一共有三个方法,作用分别是判断是不是上传请求,将request包装成MultipartHttpServletRequest、处理完后清理上传过程中产生的临时资源。
MultipartResolver
会将 HttpServletRequest 封装成 MultipartHttpServletRequest对象,便于获取参数信息以及上传的文件public interface MultipartResolver { /** * 是否为 multipart 请求 */ boolean isMultipart(HttpServletRequest request); /** * 将 HttpServletRequest 请求封装成 MultipartHttpServletRequest 对象 */ MultipartHttpServletRequest resolveMultipart(HttpServletRequest request) throws MultipartException; /** * 清理处理 multipart 产生的资源,例如临时文件 */ void cleanupMultipart(MultipartHttpServletRequest request); }
9.FlashMapManager(参数传递管理器)
- FlashMap,FlashMapManager
- 解析如下:
后端有请求转发和请求重定向两种方式,请求转发的时候Request是同一个,所以可以在转发后拿到转发前的所有信息;但是重定向后 Request是新的,如果需要在重定向前设置一些信息,重定向后获取使用应该怎么办法呢?
这就是 FlashMap存在的意义,FlashMap 借助 session 重定向前通过 FlashMapManager将信息放入FlashMap,重定向后 再借助 FlashMapManager 从 session中找到重定向后需要的 FalshMap。