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,他们的作用简单描述如下:

  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错误页面,但可以与任何类型的异常一起使用,包括任何已检查的异常,以及特定处理程序的潜在细粒度映射。

原文地址:https://www.cnblogs.com/chenjunjie12321/p/9357623.html

时间: 2024-10-13 15:08:37

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

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

SpringMVC 容器初始化时, protected void onRefresh(ApplicationContext context) { this.initStrategies(context); } protected void initStrategies(ApplicationContext context) { this.initMultipartResolver(context); this.initLocaleResolver(context); this.initTheme

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

7. initRequestToViewNameTranslator 请求视图名 它主要与视图解析有关,如果对ViewResolvers.ModelAndView.View等没有多大印象,可以先看第8节. RequestToViewNameTranslator主要是获取请求中的viewName,然后可以根据这个viewName获取ModelAndView对象. RequestToViewNameTranslator接口定义: public interface RequestToViewNameT

cocos creator基础-(二十四)cc.Director与资源加载策略

1: 了解creator场景切换; 2: 了解director基本的一些接口; 3: 理解资源加载的策略; cc.Director对象 1:游戏里面控制管理整个游戏全局对象,包括了场景切换等,为cc.Director对象; 2:导演对象全局只有一个cc.director,大写的为类, 小写的cc.director为全局的导演对象; 3: cc.director来获取导演对象实例; 4: 游戏中各种管理对象都可以通过cc.director获取,比如物理引擎管理,Action管理, 碰撞检测管理等;

教你写Android ImageLoader框架之图片加载与加载策略

在教你写Android ImageLoader框架之初始配置与请求调度中,我们已经讲述了ImageLoader的请求配置与调度相关的设计与实现.今天我们就来深入了解图片的具体加载过程以及加载的策略(包括按顺序加载和逆序加载) ,在这其中我会分享我的一些设计决策,也欢迎大家给我提建议. 图片的加载 Loader与LoaderManager的实现 在上一篇文章教你写Android ImageLoader框架之初始配置与请求调度中,我们聊到了Loader与LoaderManager. ImageLoa

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

SpringBoot初始教程之日志处理(二) 1.介绍 SpringBoot默认是采用logback进行日志处理.Logback是由log4j创始人设计的又一个开源日志组件.Logback是由log4j创始人设计的又一个开源日志组件. logback当前分成三个模块:logback-core,logback- classic和logback-access.logback-core是其它两个模块的基础模块.logback-classic是log4j的一个 改良版本.此外logback-classi

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

Solr4.8.0源码分析(21)之SolrCloud的Recovery策略(二) 题记:  前文<Solr4.8.0源码分析(20)之SolrCloud的Recovery策略(一)>中提到Recovery有两种策略,一是PeerSync和Replication.本节将具体介绍下PeerSync策略. PeeySync是Solr的优先选择策略,每当需要进行recovery了,Solr总是会先去判断是否需要进入PeerSync,只有当PeerSync被设置为跳过或者PeerSync时候发现没符合

《Spring揭秘》(十) ---- ApplicationContext之统一资源加载策略

Spring的resource Spring框架内部使用Resource接口作为所有资源的抽象和接口.例如: BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("...")); ClassPathResource就是Resource的一个特定类型的实现,代表的实位于Classpath中的资源. Resource接口可以根据资源的不同类型,或者资源所处的不同场合,给出相应的具体实现: a. ByteArr

如何解决网站因图片过大加载慢的问题?

图片过大加载慢?而不是图片太多加载慢? 首先要尽可能的压缩,看用户的忍受程度.jpg 可以用很多方法压缩,png 推荐使用 TinyPNG 工具(不过正文图片,显然要选择 jpg 格式的). 然后 1,不太"在乎"用户体验的省事方法: 图片保存成渐进式的,加载会慢慢变清晰,而不是从上往下依次加载,然后放在 CDN,设置缓存之类. 2,比较"在乎"用户体验的高端方案: 判断用户的设备(主要用在移动端).网络等,分别加载不同质量的图片(例如高端 iPhone wifi

Hibernate的强制加载策略

推迟加载: 推迟加载机制是号码大全为了防止一些无谓的功用开支而提出来关键词挖掘工具的,所谓推迟加载即是当在真实需求数据的时分,才真实履行数据加载操作.在Hibernate中供给了对实体方针的推迟加载以及对调集的推迟加载,另外在Hibernate3中还供给了对特点的推迟加载.下面咱们就别离介绍这些品种的推迟加载的细节. A.实体方针的推迟加载: 假如想对实体方针运用推迟加载,有必要要在实体的映射装备文件中进行相应的装备,如下所示: ? …… 经过将class的lazy特点设置为true,来敞开实体