Spring MVC 9大组件概述

  SpringMVC中的Servlet一共有三个层次,分别是HttpServletBean、FrameworkServlet和 DispatcherServlet。HttpServletBean直接继承自java的HttpServlet,其做用是将Servlet中配置的参数设置到相应的属性;FrameworkServlet初始化了WebApplicationContext,DispatcherServlet初始化了自身的9个组件。

  本篇博客的内容就是对9个组件作个简单概述。

  在学习9个组件以前,咱们须要先了解Handler的概念,也就是处理器。它直接应对着MVC中的C也就是Controller层,它的具体表现形式有不少,能够是类,也能够是方法。在Controller层中@RequestMapping标注的全部方法均可以当作是一个Handler,只要能够实际处理请求就能够是Handler。

(1)HandlerMapping

  是用来查找Handler的。在SpringMVC中会有不少请求,每一个请求都须要一个Handler处理,具体接收到一个请求以后使用哪一个Handler进行处理呢?这就是HandlerMapping须要作的事。css

1 public interface HandlerMapping 2 { 3     HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception; 4 }

  咱们能够看到HandlerMapping接口中只定义了一个方法,就是经过request找到HandlerExecutionChain,而HandlerExecutionChain包装了一个Handler和一组Interceptors。html

(2) HandlerAdapter

  从名字上看,它就是一个适配器。由于SpringMVC中的Handler能够是任意的形式,只要能处理请求就ok,可是Servlet须要的处理方法的结构倒是固定的,都是以request和response为参数的方法。如何让固定的Servlet处理方法调用灵活的Handler来进行处理呢?这就是HandlerAdapter要作的事情。任意形式的Handler经过使用适配器,能够“转换”成固定形式,而后交给Servlet来处理。每种Handler都要有对应的HandlerAdapter才能处理请求。java

 1 public interface HandlerAdapter {  2 
 3     /**
 4  * 判断是否支持传入的handler  5      */
 6     boolean supports(Object handler);  7 
 8     /**
 9  * 使用给定的handler处理请求 10      */
11     ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception; 12 
13     /**
14  * 返回上次修改时间,能够返回-1表示不支持 15      */
16     long getLastModified(HttpServletRequest request, Object handler); 17 
18 }

(3)HandlerExceptionResolver

  其它组件都是用来干活的。在干活的过程当中不免会出现问题,出问题后怎么办呢?这就须要有一个专门的角色对异常状况进行处理,在SpringMVC中就是HandlerExceptionResolver。具体来讲,此组件的做用是根据异常设置ModelAndView,以后再交给render方法进行渲染。咱们来看下HandlerExceptionResolver的接口定义:app

1 public interface HandlerExceptionResolver { 2 
3  ModelAndView resolveException( 4  HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex); 5 
6 }

  从上面的分析中咱们能够知道HandlerExceptionResolver只能处理页面渲染以前的异常,页面渲染过程当中的异常,它是不能处理的,这时可让容器跳转到指定的错误页面来处理异常。学习

(4)ViewResolver

  ViewResolver用来将String类型的视图名和Locale解析为View类型的视图。View是用来渲染页面的,也就是将程序返回的参数填入模板里,生成html(也多是其它类型)文件。这里就有两个关键问题:使用哪一个模板?用什么技术(规则)填入参数?这实际上是ViewResolver主要要作的工做,ViewResolver须要找到渲染所用的模板和所用的技术(也就是视图的类型)进行渲染,具体的渲染过程则交由不一样的视图本身完成。spa

1 public interface ViewResolver { 2 
3     View resolveViewName(String viewName, Locale locale) throws Exception; 4 
5 }

(5)RequestToViewNameTranslator

  ViewName是根据ViewName查找View,但有的Handler处理完后并无设置View也没有设置ViewName,这时就须要RequestToViewNameTranslator从request中找到默认的View了。如何从request中获取ViewName就是RequestToViewNameTranslator要作的事情了。RequestToViewNameTranslator在Spring MVC容器里只能够配置一个,因此全部request到ViewName的转换规则都要在一个Translator里面所有实现。code

1 public interface RequestToViewNameTranslator { 2 
3     String getViewName(HttpServletRequest request) throws Exception; 4 
5 }

(6)LocaleResolver

  解析视图须要两个参数:一是视图名,另外一个是Locale。视图名是处理器返回的,Locale是从哪里来的?这就是LocaleResolver要作的事情。LocaleResolver用于从request解析出Locale,Locale就是zh-cn之类,表示一个区域,有了这个就能够对不一样区域的用户显示不一样的结果。SpringMVC主要有两个地方用到了Locale:一是ViewResolver视图解析的时候;二是用到国际化资源或者主题的时候。htm

(7)ThemeResolver

  用于解析主题。SpringMVC中一个主题对应一个properties文件,里面存放着跟当前主题相关的全部资源、如图片、css样式等。SpringMVC的主题也支持国际化,同一个主题不一样区域也能够显示不一样的风格。SpringMVC中跟主题相关的类有 ThemeResolver、ThemeSource和Theme。主题是经过一系列资源来具体体现的,要获得一个主题的资源,首先要获得资源的名称,这是ThemeResolver的工做。而后经过主题名称找到对应的主题(能够理解为一个配置)文件,这是ThemeSource的工做。最后从主题中获取资源就能够了。blog

(8)MultipartResolver

  用于处理上传请求。处理方法是将普通的request包装成MultipartHttpServletRequest,后者能够直接调用getFile方法获取File,若是上传多个文件,还能够调用getFileMap获得FileName->File结构的Map。此组件中一共有三个方法,做用分别是判断是否是上传请求,将request包装成MultipartHttpServletRequest、处理完后清理上传过程当中产生的临时资源。继承

(9)FlashMapManager

  用来管理FlashMap的,FlashMap主要用在redirect中传递参数。

相关文章
相关标签/搜索