SpringMVC的九大组件

搭配这张转载的图使用更佳(SpringMVC工作原理图)

1.HandlerMapping(处理器映射器)

  作用 : 寻找Handler(注解/配置文件/接口)

  首先解释一下handler,handler代表实际可以处理请求的方法或者类,例如被注解@ResquestMapping所标记的方法,就可以看作一个Handler

  作用 : HandlerMapping的主要作用是根据请求的资源uri来查找对应的handler

2. HandlerAdapter(处理器适配器)

  作用 : 处理找到的Handler

  在我们找到对应的Handler时,我们则要开始处理Handler,因为Handler的实现多种多样,所以对于Handler不同的内部结构需要进行一定的处理

       容器在初始化的时候会自动帮我们注入 (也可以自己配置)RequestMappingHandlerAdapter 、HttpRequestHandlerAdapter 和 SimpleControllerHandlerAdapter 这三个配置器。
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 }
  1. supports方法:是判断该适配器是否支持这个HandlerMethod,就是当得到一个handler时,该接口子类该方法做判断(就是类似handler instanceof Controller的判断方式),用来得到适配这个handler的适配器子类。
  2. handle方法:用来执行控制器处理函数,获取ModelAndView 。就是根据该适配器调用规则执行handler方法
  3. getLastModified方法:处理响应请求,控制客户端的GET请求(如post请求不受影响)是否被真实响应还是直接响应为不修改(304),servlet的service方法根据getLastModified的返回值
  • HttpRequestHandlerAdapter可以执行 HttpRequestHandler 类型的 handler
  • SimpleControllerHandlerAdapter可以执行 Servlet 类型的 handler
  • RequestMappingHandlerAdapter可以执行 Controller 类型的 handler
  

3. HandlerExceptionResolver(异常处理器)

  作用 : 当我们在寻找和处理Handler时难免会出现一些问题(异常),这个时候就需要一个专门来处理异常的角色

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。

 
  
  

 

  
  



 

posted @ 2021-01-15 20:14  梦落成空  阅读(1452)  评论(0编辑  收藏  举报