前言

上一篇介绍了SpringMVC的启动过程,DispatcherServlet作为一个前端控制器,分发处理http请求

1.DispatcherServlet流程图

具体流程:

1. 用户发请求-->DispatcherServlet,前端控制器收到请求后自己不进行处理,而是委托给其他的解析器进行处理,作为统一访问点,进行全局的流程控制。

2.DispatcherServlet-->HandlerMapping,HandlerMapping将会把请求映射为HandlerExecutionChain对象(包含一个Handler处理器,多个HandlerInterceptor拦截器)。

3.DispatcherServlet-->HandlerAdapter,HandlerAdapter将会把处理器包装为适配器,从而支持多种类型的处理器。

4.HandlerAdapter-->处理器功能处理方法的调用,HandlerAdapter将会根据适配的结果调用真正的处理器的功能处理方法,完成功能处理,并返回一个ModelAndView对象(包含模型数据,逻辑视图名)

5.ModelAndView的逻辑视图名-->ViewResolver,ViewResoler将把逻辑视图名解析为具体的View。

6.View-->渲染,View会根据传进来的Model模型数据进行渲染,此处的Model实际是一个Map数据结构

7.返回控制权给DispatcherServlet,由DispatcherServlet返回响应给用户。

2.HandlerMapping

HandlerMapping处理器映射器,功能是根据请求的url找到合适的处理器。

2.1 HandlerMapping结构图

2.2 BeanNameUrlHandlerMapping

BeanNameUrlHandlerMapping处理器映射器,会根据请求的url与spring容器中定义的处理器bean的name属性值进行匹配,从而在spring容器中找到处理器bean实例.

<!-- 注册处理器映射器-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" /> <!-- 注册处理器-->
<bean id="/show.do" class="com.example.handlers.HelloWorldController" />

对于处理器的bean的name属性值必须以"/"开头

2.3 SimpleUrlHandlerMapping

使用BeanNameUrlHandlerMapping映射器有两点不足:

1.处理器Bean的id为一个url请求路径,而不是Bean的名称,有些不伦不类。

2.处理器Bean的定义与请求url绑定在了一起。若出现多个url请求同一个处理器的情况,就需要在spring容器中配置多个该处理器类的<bean/>。这将导致容器会创建多个该处理器类实例。

SimpleUrlHandlerMapping处理器映射器,会根据请求的url与Spring容器中定义的处理器映射器子标签的key属性进行匹配。匹配上后,再将该key的value值与处理器bean的id值进行匹配,从而在Spring容器中找到处理器bean。

<!--注册处理器映射器-->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/hello.do">myController</prop>
<prop key="/world.do">myController</prop>
<prop key="/my.do">myController</prop>
</props>
</property>
</bean> <!--注册处理器-->
<bean id="myController" class="com.examaple.handlers.MyController">

2.4 DefaultAnnotationHandlerMapping

主要是针对注解,这个已废弃使用,用RequsetMappingHandlerMapping来代替

2.5 RequestMappingHandlerMapping

针对注解@RequestMapping  @Controller的

3.HandlerAdapter

HandlerApdater处理器适配器,作用是根据请求的url找到处理器的调用方法

3.1 HandlerAdapter体系结构图

3.2  RequestMappingHandlerAdapter

实际就是执行@RequestMapping注解的方法。

3.3  AnnotationMethodHandlerAdapter

已被废弃,就不做过多介绍

3.4  SimpleControllerHandlerAdapter

实际就是执行Controller的handleRequest方法。要求handler必须实现Controller接口

3.5  HttpRequestHandlerAdapter

实际就是执行HttpRequestHandler的handleRequest方法。要求handler必须实现HttpRequestHandler接口

3.6. SimpleServletHandlerAdapter

实际就是执行HttpServlet的service方法

DispatcherServlet的处理流程的更多相关文章

  1. 描述一下 DispatcherServlet 的工作流程 ?

    DispatcherServlet 的工作流程可以用一幅图来说明: 1.向服务器发送 HTTP 请求,请求被前端控制器 DispatcherServlet 捕获. 2. DispatcherServl ...

  2. SpringMVC源码剖析(三)- DispatcherServlet的初始化流程

    在我们第一次学Servlet编程,学Java Web的时候,还没有那么多框架.我们开发一个简单的功能要做的事情很简单,就是继承HttpServlet,根据需要重写一下doGet,doPost方法,跳转 ...

  3. SpringMVC源码分析(3)DispatcherServlet的请求处理流程

    <springmvc源码分析(2)dispatcherservlet的初始化>初始化DispatcherServlet的多个组件. 本文继续分析DispatcherServlet解析请求的 ...

  4. spring mvc dispatcherservlet处理request流程

    1.dispatcherservlet接收到请求后,doDispatch(request,response) 2.doDispatch()里进行handlermapping,handlermappin ...

  5. DispatcherServlet 分发流程

    0 太长不看版 HTTPServlet 的 Service 方法将请求按类进行分解 主要是根据HTTP方法的类型调用 doXXX 方法 GET 和 HEAD 方法需要对 if-modified-sin ...

  6. DispatcherServlet作用

    DispatcherServlet是前端控制器设计模式的实现,提供Spring Web MVC的集中访问点,而且负责职责的分派,而且与Spring IoC容器无缝集成,从而可以获得Spring的所有好 ...

  7. 6.理解DispatcherServlet

    DispatcherServlet的作用 DispatcherServlet是前端控制器设计模式的实现,提供Spring Web MVC的集中访问点,负责职责的分派, 且与Spring IoC容器无缝 ...

  8. 前端控制器DispatcherServlet 详解

    DispatcherServlet 是前端控制器设计模式的实现,提供 Spring Web MVC 的集中访问点,而且负责职责的分派,而且与 Spring IoC 容器无缝集成,从而可以获得 Spri ...

  9. 第三章 DispatcherServlet详解

    3.1.DispatcherServlet作用 DispatcherServlet是前端控制器设计模式的实现,提供Spring Web MVC的集中访问点,而且负责职责的分派,而且与Spring Io ...

随机推荐

  1. Wyx20162314 2016-2017-2 《程序设计与数据结构》课程总结

    20162314 2016-2017-2 <程序设计与数据结构>课程总结 一.每周作业.结对编程博客的链接汇总 预备作业一01 20162314:专业的期许.浅谈师生关系.对未来学习任务的 ...

  2. [nowcoder]再编号

    链接:https://www.nowcoder.com/acm/contest/158/C 每变化一次,tot=tot*(n-1),且每两个数之差delta*=-1,直接根据这两个性质暴力循环1000 ...

  3. Java Lambda表达

    Java 8 lambda表达式示例 我个人对Java 8发布非常激动,尤其是lambda表达式和流API.越来越多的了解它们,我能写出更干净的代码.虽然一开始并不是这样.第一次看到用lambda表达 ...

  4. ftp禁止切换回上级目录

    打开并编辑/etc/vsd/vsd.conf # vi /etc/vsd/vsftpd.conf 取消如下行注释 chroot_list_enable=YES 保存并重启vsftpd # /etc/i ...

  5. geoserver源码学习与扩展——kml/kmz转shapefile文件

    geoserver通过工作空间Workspace-数据源DataStore-图层Layer管理地理数据,默认只支持shapefile格式的文件发布,不支持kml/kmz.csv的文件格式,所以存在将这 ...

  6. Map 的 key、value 是否允许为null

    Map的key和value是否允许null? 直接写程序验证一下: import java.util.HashMap; import java.util.Hashtable; import java. ...

  7. Entity Framework 6 Code First 系列:无需修改实体和配置-在MySql中使用和SqlServer一致的并发控制

    无需修改实体和配置,在MySql中使用和SqlServer一致的并发控制.修改RowVersion类型不可取,修改为Timestamp更不可行.Sql Server的RowVersion生成一串唯一的 ...

  8. python学习笔记(异常处理)

    上次提到正则表达式 当未匹配到数据返回值 None 再使用 match.group 会出现异常 AttributeError 为了避免异常我改成“ match != None” 这次加入异常处理 #! ...

  9. c#实现验证某个IP地址是否能ping通

    using System; using System.Collections.Generic; using System.Text; using System.IO; using System.Net ...

  10. Codeforces Round #250 (Div. 2)D

    给你一张无向图,每个点有一个权值,对于一条从l到r 的边权值是l到r路径上最小的点的权值,(多条路取最大的权值),然后求每两个点之间的权值和/点对数 题解:并查集维护,先从点大的边排序,然后依次加边, ...