前言

上一篇介绍了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. Python3:读取配置dbconfig.ini(含有中文)显示乱码的解决方法

    Python3:读取配置dbconfig.ini(含有中文)显示乱码的解决方法 一.原因 Python 3 中虽有encoding 参数,但是对于有BOM(如Windows下用记事本指定为utf-8) ...

  2. SQL-ALTER-change和modify区别

      ALTER 对于列的应用:   1.更改列名      格式:CHANGE old_col_name new_col_name column_definition      保留old和new列名 ...

  3. Linux内核模块编写详解

    内核编程常常看起来像是黑魔法,而在亚瑟 C 克拉克的眼中,它八成就是了.Linux内核和它的用户空间是大不相同的:抛开漫不经心,你必须小心翼翼,因为你编程中的一个bug就会影响到整个系统,本文给大家介 ...

  4. sublime使用sublimelint-luacheck屏蔽指定警告

    在成功安装SublimeLinter-lua与luacheck以后,如果没有语法error,则会进行警告提示. 如下图 waring: line contains trailing whitespac ...

  5. resultMap结果集映射

    resultMap结果集是用来定义sql查询的结果与java对象的映射关系.它主要解决2大问题: 1)可以解决POJO属性名和表结构的字段名不一致问题(甚至是 不是标准的驼峰命名法) 2)可以完成高级 ...

  6. java基础(5)--流程控制结构

    流程控制结构 if结构 当关系表达式为true时,执行语句 if(关系表达式){ //语句块 } if-else结构 当关系表达式为true时,执行语句块1,否则执行语句块2 if(关系表达式){ / ...

  7. 多线程之wait,notify,volatile,synchronized,sleep

    最近在学习多线程,现在进行总结一下吧.首先要了解一下以下几个名词. (1)wait:当线程调用wait()方法时,当前该线程会进入阻塞状态,且释放锁,使用wait方法的时候,必须配合synchroni ...

  8. Mybatis报错Cause: org.apache.ibatis.executor.ExecutorException: Executor was closed.

    SqlSession被关闭了,检查是否使用了被关闭的SqlSession.

  9. python作业大纲分析

    2018-11-22 目前自学python这么久,零零散散的写了几次作业,下面是几个在完成过程中遇到困难较多的作业. 1.ATM+购物车系统 需求: 1.额度 15000或自定义  2.实现购物商城, ...

  10. Ajax-05 使用XMLHttpRequest和jQuery实现Ajax实例

    需求: (django)使用XMLHttpRequest和jQuery实现Ajax加法运算 url.py: from django.conf.urls import url from hello im ...