SpringMVC的九大组件完成的任务粗解。

 Spring MVC中最最核心的类便是DispatcherServlet,所有的前端请求到来之后,都要经过它,并由它所初始化创建出来的九大组件分工参与处理。下面罗列出来这九大组件:

  • 一. HandlerMapping

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

  • 二. HandlerAdapter​​​​​​​

从名字上看,这是一个适配器。因为Spring MVC中Handler可以是任意形式的,只要能够处理请求便行, 但是把请求交给Servlet的时候,由于Servlet的方法结构都是如doService(HttpServletRequest req, HttpServletResponse resp) 这样的形式,让固定的Servlet处理方法调用Handler来进行处理,这一步工作便是HandlerAdapter要做的事。这个接口有以下三个方法:

boolean supports(Object handler);

ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;

long getLastModified(HttpServletRequest request, Object handler);

其中 handle方法 便是具体使用Handler来处理请求逻辑,并返回 ModelAndView 到下一步处理流程。

  • 三. HandlerExceptionResolver

​​​​​​​从这个组件的名字上看,这个就是用来处理Handler过程中产生的异常情况的组件。 具体来说,此组件的作用是根据异常设置ModelAndView, 之后再交给 render方法进行渲染,而 render 便将ModelAndView 渲染成页面。 不过有一点,HandlerExceptionResolver 只是用于解析对请求做处理阶段产生的异常,而渲染阶段的异常则不归他管了,这也是SpringMVC 组件设计的一大原则——分工明确互不干涉。

  • 四. ViewResolver

视图解析器,相信大家对这个应该都很熟悉了。因为通常在springMVC的配置文件中,都会配上一个该接口的实现类来进行视图的解析。 这个组件的主要作用,便是将String类型的视图名和Locale解析为View类型的视图。这个接口只有一个方法:

View resolveViewName(String viewName, Locale locale) throws Exception;

从该定义可以看出,Controller层返回的String类型的视图名viewName,最终会在这里被解析成为View. View是用来渲染页面的,也就是说,它会将程序返回的参数和数据填入模板中,最终生成 html 文件。ViewResolver在这个过程中,主要做两件大事,即,ViewResolver会找到渲染所用的模板(使用什么模板来渲染?)和所用的技术(使用什么技术?其实也就是视图的类型,是jsp啊还是其他blabla的)填入参数。默认情况下,SpringMVC会为我们自动配置一个InternalResourceViewResolver,这个是针对jsp类型视图的。

  • 五. RequestToViewNameTranslator

老实说,这个我也比较陌生。 这个组件的作用,在于从Request中获取viewName. 因为ViewResolver是根据ViewName 查找View, 但有的Handler处理完成之后,没有设置View也没有设置ViewName, 便要通过这个组件来从Request中查找viewName.

  • 六. LocaleResolver

从上面可以看到,ViewResolver的resolveViewName方法,需要两个参数。那么第二个参数Locale是从哪来的呢,这就是LocaleResolver要做的事了。 LocaleResolver 用于从request中解析出 Locale, 在中国大陆地区,Locale当然就会是zh-CN之类,用来表示一个区域。这个类也是i18n的基础。

  • 七. ThemeResolver​​​​​​​

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

  • 八. MultipartResource

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

  • 九. FlashMapManager

说到FlashMapManager,就等先提一下FlashMap.

FlashMap用于重定向Redirect时的参数数据传递,比如,在处理用户订单提交时,为了避免重复提交,可以处理完post请求后redirect到一个get请求,这个get请求可以用来显示订单详情之类的信息。这样做虽然可以规避用户刷新重新提交表单的问题,但是在这个页面上要显示订单的信息,那这些数据从哪里去获取呢,因为redirect重定向是没有传递参数这一功能的,如果不想把参数写进url(其实也不推荐这么做,url有长度限制不说,把参数都直接暴露,感觉也不安全), 那么就可以通过flashMap来传递。只需要在redirect之前,将要传递的数据写入request(可以通过ServletRequestAttributes.getRequest()获得)的属性OUTPUT_FLASH_MAP_ATTRIBUTE中,这样在redirect之后的handler中spring就会自动将其设置到Model中,在显示订单信息的页面上,就可以直接从Model中取得数据了。

而FlashMapManager就是用来管理FlashMap的。

转载:https://my.oschina.net/progchen/blog/1537350

猜你喜欢

转载自blog.csdn.net/xionglangs/article/details/78151908