springmvc DispatchServlet初始化九大加载策略(二)
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,他们的作用简单描述如下:
- AbstractUrlHandlerMapping: 通过匹配URL,将URL与handler联系起来
- 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个:
- AbstractHandlerMethodAdapter -- (方便扩展,)
- RequestMappingHandlerAdapter -- 可以执行是 HadnlerMethod 类型的 Handler
- HttpRequestHandlerAdapter -- 可以执行 HttpRequestHandler 类型的 Handler
- SimpleControllerHandlerAdapter -- 可以执行 Controller 类型的 Handler
- 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处理。
<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初始化九大加载策略(二)的更多相关文章
- springmvc DispatchServlet初始化九大加载策略(一)
由于篇幅较长,因此分三篇进行讲解: springmvc DispatchServlet初始化九大加载策略(一) springmvc DispatchServlet初始化九大加载策略(二) spring ...
- springmvc DispatchServlet初始化九大加载策略(三)
7. initRequestToViewNameTranslator 请求视图名 它主要与视图解析有关,如果对ViewResolvers.ModelAndView.View等没有多大印象,可以先看第8 ...
- Spring+SpringMVC+MyBatis深入学习及搭建(十二)——SpringMVC入门程序(一)
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6999743.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(十一)——S ...
- SpringBoot初始教程之日志处理(二)
SpringBoot初始教程之日志处理(二) 1.介绍 SpringBoot默认是采用logback进行日志处理.Logback是由log4j创始人设计的又一个开源日志组件.Logback是由log4 ...
- Solr4.8.0源码分析(21)之SolrCloud的Recovery策略(二)
Solr4.8.0源码分析(21)之SolrCloud的Recovery策略(二) 题记: 前文<Solr4.8.0源码分析(20)之SolrCloud的Recovery策略(一)>中提 ...
- js加载优化-二
http://www.cnblogs.com/radom/archive/2011/04/26/2028886.html ontrolJS 主要为了是解决网页加载中Js文件的性能问题,ControlJ ...
- 【死磕 Spring】----- IOC 之 Spring 统一资源加载策略
原文出自:http://cmsblogs.com 在学 Java SE 的时候我们学习了一个标准类 java.net.URL,该类在 Java SE 中的定位为统一资源定位器(Uniform Reso ...
- hibernate框架学习之数据抓取(加载)策略
Hibernate获取数据方式 lHibernate提供了多种方式获取数据 •load方法获取数据 •get方法获取数据 •Query/ Criteria对象获取数据 lHibernate获取的数据分 ...
- hibernate框架学习第六天:QBC、分页查询、投影、数据加载策略、二级缓存
QBC查询 1.简单查询 Criteria c = s.createCriteria(TeacherModel.class); 2.获取查询结果 多条:list 单挑:uniqueResult 3.分 ...
随机推荐
- setting.xml配置文件 --转载
转载出处:http://www.cnblogs.com/yakov/archive/2011/11/26/maven2_settings.html 在此,简单的说下 setting.xml 和 pom ...
- Find substring with K distinct characters
Given a string and number K, find the substrings of size K with K distinct characters. If no, output ...
- [转]Outlook HTML渲染
转自:http://www.cnblogs.com/dolphinX/p/4081828.html 是不是很讨厌为Email代码兼容Outlook? 太遗憾了!虽然光都有尽头,但Outlook始终存在 ...
- javascript中有关this的解析题
1.作用域链 作用域:浏览器给js一个生存环境(栈)内存 作用域链:js中的关键字var function 都可以提前声明和定义,提前声明和定义,放在我们的内存地址(堆)内存中,然后js从上到下逐行执 ...
- [转载]tornado.database添加PooledDB连接池功能
转载自 http://chenxiaoyu.org/2009/12/01/python-tornado-dbutil.html tornado.database模块简单包装了下对MySQL的操作,短小 ...
- 深度学习、图像识别入门,从VGG16卷积神经网络开始
刚开始接触深度学习.卷积神经网络的时候非常懵逼,不知道从何入手,我觉得应该有一个进阶的过程,也就是说,理应有一些基本概念作为奠基石,让你有底气去完全理解一个庞大的卷积神经网络: 本文思路: 一.我认为 ...
- 面对最菜TI战队,OpenAI在Dota2上输的毫无还手之力
作者:Tony Peng 去年,OpenAI 的 1v1 AI 击败了世界顶尖选手 Dendi,OpenAI CTO Greg Brockman 承诺:明年,我们会带着 5v5 的 AI bot 重回 ...
- 关于Node和Deno
Node和Deno的作者Ryan Dahl开Deno并不是“just for fun”, 也不是为了取代Node, 他有着更加远大的目标. 记住以下要点: 1. Deno目前只是一个Demo或者说是原 ...
- python内置函数详细介绍
知识内容: 1.python内置函数简介 2.python内置函数详细介绍 一.python内置函数简介 python中有很多内置函数,实现了一些基本功能,内置函数的官方介绍文档: https: ...
- 1.Log4j入门
转自:https://blog.csdn.net/luohai859/article/details/52250807 日志是应用软件中不可缺少的部分, .Apache的开源项目log4j是一个功能强 ...