4. initHandlerMappings 请求分发

HandlerMappings是一个List<HandlerMapping>类型数据,也就是说初始化可以存放多种Mapping,和其他几种组件加载方式一样,如果用户没有在配置文件选择 HanderMapping则会到DispatcherServlet.properties文件获取:

org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\
org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping

可知默认情况下初始化的BeanNameUrlHandlerMapping与DefaultAnnotationHandlerMapping这两种Mapping:

DefaultAnnotationHandlerMapping

(spring3.1以后已经过时)目前使用RequestMappingHandlerMapping来代替,用于注解@Controller,@RequestMapping来定义controller,主要作用是将Controller的注解值(类路径及方法路径)与Controller实例映射起来。

BeanNameUrlHandlerMapping

通过配置文件,把一个URL映射到Controller

HandlerMapping家族有两个分支,分别是AbstractUrlHandlerMapping和AbstractHandlerMethodMapping,它们又统一继承于AbstractHandlerMapping,他们的作用简单描述如下:

  1. AbstractUrlHandlerMapping: 通过匹配URL,将URL与handler联系起来
  2. AbstractHandlerMethodMapping: 普遍用于@requestMaping,匹配内容将它的Method作为handler

HanderMapping接口只有一个方法getHandler(request),它的作用是获取HandlerExecutionChain,HandlerExecutionChain对象封装了一个handler处理对象和一些interceptors,也就是说每一次请求要执行hander与这些拦截器相关的逻辑。关于Handler与Interceptor 拦截器的具体知识可以参考《浅探SpringMVC中HandlerExecutionChain之handler、interceptor》

5. initHandlerAdapters 请求handler处理器

与HandlerMappings一样,HandlerAdapters是一个List类型数据,默认的HandlerAdapters为SimpleControllerHandlerAdapter、AnnotationMethodHandlerAdapter,如下:

org.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\
org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter

SpringMVC 中通过Handler来找到支持它的HandlerAdapter,找到Handler对应的HandlerAdapter后,处理这个Hander(也就是处理这个请求)。其中AnnotationMethodHandlerAdapter已经被废除。

“HandlerAdapter字面上的意思就是处理适配器,它的作用用一句话概括就是调用具体的方法对用户发来的请求来进行处理。当handlerMapping获取到执行请求的controller时,DispatcherServlte会根据controller对应的controller类型来调用相应的HandlerAdapter来进行处理。” -- 《SpringMVC之HandlerAdapter解析》

HandlerAdapter 接口中的3个方法如下:

// 当前 HandlerAdapter 是否支持这个 Handler
boolean supports(Object handler); // 处理Handler请求,并返回一个视图对象ModelAndView
ModelAndView handle(HttpServletRequest req, HttpServletResponse res, Object handler); // 获取最后修改时间
long getLastModified(HttpServletRequest request, Object handler);

spingmvc 4.3中实现了HandlerAdapter接口的有6个类,其中AnnotationMethodHandlerAdapter已经废除,剩下5个:

  1. AbstractHandlerMethodAdapter -- (方便扩展,)
  2. RequestMappingHandlerAdapter -- 可以执行是 HadnlerMethod 类型的 Handler
  3. HttpRequestHandlerAdapter -- 可以执行 HttpRequestHandler 类型的 Handler
  4. SimpleControllerHandlerAdapter -- 可以执行 Controller 类型的 Handler
  5. SimpleServletHandlerAdapter -- 可以执行 Servlet 类型的 Handler

一个误区: 由于在项目中常见也是常有的处理器用的是配置的方式来做的,因此很容易以为Controller接口就是所有的处理器的接口,眼里就只有Controller了。处理器根本就不只有Controller这一种。还有HttpRequestHandler,Servlet等处理器。

RequestMappingHandlerMapping 会把Controller里面带有@RequestMapping注解的方法都加到一个容器里面,然后RequestMappingHandlerAdapter根据里面的自定义配置可以对经过这些方法的请求的数据做一些额外的处理。

SimpleControllerHanderAdapter 主要用于用于自定Controller接口的handleRequest,我们还记得刚开始学习Controller时候,自定Controller要么继承AbstractController,要么implements Controller接口。

HttpRequestHandlerAdapter 处理HttpRequestHandler类型的Handler,如: SpringMVC中请求经过dispatcherServlet时并不能找到资源,当设置了默认的servlet时候,就会被DefaultServletHttpRequestHandler处理。

参考《Spring MVC静态资源处理》

<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.jpg</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.css</url-pattern>
</servlet-mapping>

SimpleServletHandlerAdapter (待补充)

6. initHandlerExceptionResolvers 请求异常

官方文档大致描述:

Interface to be implemented by objects that can resolve exceptions thrown during handler mapping or execution, in the typical case to error views. Implementors are typically registered as beans in the application context.
Error views are analogous to JSP error pages but can be used with any kind of exception including any checked exception, with potentially fine-grained mappings for specific handlers.

由对象实现的接口,可以解析在处理程序映射或执行期间抛出的异常,尤其是在视图解析是发生的异常错误。 HandlerExceptionResolver实现者通常在应用程序上下文中注册为bean。 错误视图类似于JSP错误页面,但可以与任何类型的异常一起使用,包括任何已检查的异常,以及特定处理程序的潜在细粒度映射。

springmvc DispatchServlet初始化九大加载策略(二)的更多相关文章

  1. springmvc DispatchServlet初始化九大加载策略(一)

    由于篇幅较长,因此分三篇进行讲解: springmvc DispatchServlet初始化九大加载策略(一) springmvc DispatchServlet初始化九大加载策略(二) spring ...

  2. springmvc DispatchServlet初始化九大加载策略(三)

    7. initRequestToViewNameTranslator 请求视图名 它主要与视图解析有关,如果对ViewResolvers.ModelAndView.View等没有多大印象,可以先看第8 ...

  3. Spring+SpringMVC+MyBatis深入学习及搭建(十二)——SpringMVC入门程序(一)

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6999743.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(十一)——S ...

  4. SpringBoot初始教程之日志处理(二)

    SpringBoot初始教程之日志处理(二) 1.介绍 SpringBoot默认是采用logback进行日志处理.Logback是由log4j创始人设计的又一个开源日志组件.Logback是由log4 ...

  5. Solr4.8.0源码分析(21)之SolrCloud的Recovery策略(二)

    Solr4.8.0源码分析(21)之SolrCloud的Recovery策略(二) 题记:  前文<Solr4.8.0源码分析(20)之SolrCloud的Recovery策略(一)>中提 ...

  6. js加载优化-二

    http://www.cnblogs.com/radom/archive/2011/04/26/2028886.html ontrolJS 主要为了是解决网页加载中Js文件的性能问题,ControlJ ...

  7. 【死磕 Spring】----- IOC 之 Spring 统一资源加载策略

    原文出自:http://cmsblogs.com 在学 Java SE 的时候我们学习了一个标准类 java.net.URL,该类在 Java SE 中的定位为统一资源定位器(Uniform Reso ...

  8. hibernate框架学习之数据抓取(加载)策略

    Hibernate获取数据方式 lHibernate提供了多种方式获取数据 •load方法获取数据 •get方法获取数据 •Query/ Criteria对象获取数据 lHibernate获取的数据分 ...

  9. hibernate框架学习第六天:QBC、分页查询、投影、数据加载策略、二级缓存

    QBC查询 1.简单查询 Criteria c = s.createCriteria(TeacherModel.class); 2.获取查询结果 多条:list 单挑:uniqueResult 3.分 ...

随机推荐

  1. 常用的sql语句(存储过程语法)

    1.存储过程语法 ①package create or replace package PKG_RPT_WAREHOUSE is -- Author : -- Created : 2018/9/28 ...

  2. ZooKeeper 集群的安装、配置---Dubbo 注册中心

    ZooKeeper 集群的安装.配置.高可用测试 Dubbo 注册中心集群 Zookeeper-3.4.6 Dubbo 建议使用 Zookeeper 作为服务的注册中心. Zookeeper 集群中只 ...

  3. 关于安卓苹果手机安装证书抓https的关键步骤

    苹果有关键步骤!!!

  4. Fix-Dell iDRAC 7 error: RAC0218: The maximum number of user sessions is reached

    Hi Everyone, We came across the following error while performing some preventative maintenance check ...

  5. [UE4]场景光照改进PostProcessVolume

    PostProcessVolume可以做的效果很多,其中就可以实现太阳光斑效果. Unbound勾上上,就表示不受“PostProcessVolume”组件的大小限制,直接应用到整个世界.如果不勾选, ...

  6. 微信公众平台测试帐号的注册与使用(自己的服务器<---->微信后台<---->测式公众号)

    打开注册的网址:http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login 用手机微信扫描网页左边的二维码,然后在手机上确认即可: 至此 ...

  7. labview如何生成可执行文件

    labview生成可执行文件可以分为两种情况. 第一种,是电脑中有labview软件开发环境的情况 第二种,是电脑中没有安装labview软件开发环境 下面是一个简单的labview代码: 程序解释: ...

  8. El中调用静态方法

    最近在项目中遇到需要调用静态方法的问题,形如: <c:forEach items="beans" var="bean"> <p>总数:$ ...

  9. bravado哺乳内衣适合试穿体验,分享给需要买哺乳内衣的妈妈们。

    看来看去还是觉得在美德乐天猫旗舰店(www.bravadobravado.com)购买最保险. 这款内衣穿起来非常舒服,感觉一点都不勒,而且面料也很透气,我生宝宝之前怀孕的时候穿80C,这个本来一开始 ...

  10. HFDS核心技术

    HDFS 设计的前提与目标 HDFS体系结构1 HDFS体系结构2 HDFS特性与优点 高容错性保障机制 HDFS不适合的场景 HDFS2.0的新特征 HA-QJM Federation 快照 异构层 ...