• DispatcherServlet的处理流程


    前言

         上一篇介绍了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方法

  • 相关阅读:
    Windows10下Opencv4+CMake+MinGW64+VSC安装教程
    相机标定问题-实践操作流程
    eNSP仿真学习,网络入门!
    SFTP服务的使用!!
    树莓派B+使用入门&RPI库安装&wringPi库安装
    Python基本语法初试
    基于51单片机+DAC0832的信号发生器
    各种标志位的含义
    根文件系统ramdisk.image.gz && uramdisk.image.gz
    Linux中/etc/inittab文件
  • 原文地址:https://www.cnblogs.com/whx7762/p/7799951.html
Copyright © 2020-2023  润新知