• springmvc的执行流程


    前面springmvc的程序运行都成功,我们可以看一下前端控制器DispatcherServlet在整个流程中所起的作用

    DispatcherServlet源码如下

    protected void initStrategies(ApplicationContext context) {
    		initMultipartResolver(context);//初始化上传文件解析器
    		initLocaleResolver(context);//初始化本地解析器
    		initThemeResolver(context);//初始化主题解析器
    		initHandlerMappings(context);//初始化处理器映射器,将请求映射到处理器上
    		initHandlerAdapters(context);//初始化处理适配器
    		initHandlerExceptionResolvers(context);//初始化异常处理器
    		initRequestToViewNameTranslator(context);//初始化请求到视图名称解析器
    		initViewResolvers(context);//初始化视图解析器
    		initFlashMapManager(context);//初始化flash映射管理器
    	}
    

    initStrategies方法将在WebApplicationContext初始化后自动执行,自动扫描上下文的Bean,根据名称或类型匹配的机制查找自定义的组件,如果没有找到,则会装配spring默认的组件,org.springframework,web.servlet路径下的DispatcherServlet.properties

    # Default implementation classes for DispatcherServlet's strategy interfaces.
    # Used as fallback when no matching beans are found in the DispatcherServlet context.
    # Not meant to be customized by application developers.
    # 本地化解析器
    org.springframework.web.servlet.LocaleResolver=org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver
    # 主题解析器
    org.springframework.web.servlet.ThemeResolver=org.springframework.web.servlet.theme.FixedThemeResolver
    # 处理映射器
    org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,
    	org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping
    # 处理适配器
    org.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,
    	org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,
    	org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter
    # 异常处理器
    org.springframework.web.servlet.HandlerExceptionResolver=org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver,
    	org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver,
    	org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver
    # 视图名称解析器
    org.springframework.web.servlet.RequestToViewNameTranslator=org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator
    # 视图解析器
    org.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver
    # FlashMap映射器
    org.springframework.web.servlet.FlashMapManager=org.springframework.web.servlet.support.SessionFlashMapManager
    

    本地化解析器 只允许一个实例

    1、查找名为localeResolver、类型为LocaleResolver的Bean作为该类型组件
    2、如果没有找到,则使用默认AcceptHeaderLocaleResolver

    主题解析器 只允许一个实例

    1、查找名为themeResolver,类型为ThemeResolver的bean作为该类型的组件
    2、如果没有找到,则使用默认的FixedThemeResolver

    处理器映射器 允许多个实例

    1、如果detectAllHandlerMappings的属性为true,则根据类型匹配戒指查找上下文以及Spring容器中的所有类型为HandlerMapping的Bean,将他们作为该类型的组件
    2、如果detectAllHandlerMappings的属性为false,则查找名为handlerMappping 类型为HandlerMapping的Bean作为该类型的组件
    3、如果以上两种方式都没有,则使用BeanNameUrlHandlerMapping实现类创建该类型的组件

    处理器适配器 允许多个实例

    1、如果detectAllHandlerAdapters的属性为true,则根据类型匹配机制查找上下文以及Spring容器中所有类型为HandlerAdapter的Bean,将他们作为该类型的组件
    2、如果detectAllHandlerAdapters的属性为false,则查找名为handlerAdapter类型为handlerAdapter的bean作为该类型的组件
    3、如果以上两种都没有找到,则使用默认配置文件中的三个实现类分别创建适配器,并将其添加到适配器列表中

    处理异常解析器 允许多个实例

    1、如果detectAllHandlerExceptionResolvers的属性为true,则根据领匹配机制查找上下文以及Spring容器中所有类型为HandlerExceptionResolver的bean,将他们作为该类型的组件
    2、如果detectAllHandlerExceptionResolvers的属性为false,则查找名为handlerExceptionResolver,类型为HandlerExceptionResolvers的bean作为该类型的组件
    3、如果以上两种都没有找到,则使用默认配置文件中默认实现类

    视图名称解析器 只允许一个实例

    1、查找名为viewNameTranslator类型为RequestToViewTranslator的bean作为该类型的组件
    2、如果没有找到,则使用默认配置文件中的实现类DefaultRequestToViewNameTranslator

    视图解析器 允许多个实例

    1、如果detectAllViewResolvers的属性为true,则根据类型匹配机制查找上下文以及Spring容器中的所有类型为ViewResolver的bean,将他们作为该类型的组件
    2、如果detectAllViewResolvers的属性为false,则查找名为viewResolvers类型为ViewResolver的Bean作为类型的醉娜
    3、如果以上两种方式都没有找到的话,就使用配置文件中的默认实现类InternalResourceViewResolver

    文件上传解析器 只允许一个实例

    1、查找名为muliipartResolver类型为MuliipartResolver的Bean作为该类型组件
    2、如果没有找到,则使用配置中加载的组件

    FlashMap映射管理器

    1、查找名为FlashMapManager 类型为SessionFlashMapManager的bean作为该类型的组件,用于管理FlashMqap,即数据默认存储在HttpSession中

    SpringMVC的执行流程


    1、用户向服务器发送请求,请求呗前端控制器DispatcherServlet截获
    2、DispatcherServlet对请求的URL进行解析,得到URI,然后根据URI调用HandlerMapper获取该Handler配置的所有相关的对象,包括Handler对象以及Handler对象对应的拦截器,这些对象会被封装到一个 HandlerExecutionChain对象中返回
    3、DispatcherServlet根据获得的Handler,选择一个合适的HandlerAdapter,HandlerAdapter会处理多种handler,调用handler实际处理请求的方法
    4、提取请求中的数据模型,开始执行Handler(Controller),在填充Handler的入参过程中根据配置,Spring做了一些如下工作
    -- a)消息转换。将请求消息(如JSON,XML等数据)转换成一个对象,将对象转换为指定的响应消息
    -- b)数据转换 。 对请求消息进行数据转换,如String转换为Integer,Double等
    -- c)数据格式化。对请求消息进行格式化。如将字符串转换为格式化数字或格式化日期
    -- d)数据验证。验证数据的有效性,验证结果存储在BindingResult或Error中
    5、handler执行完之后,向DispatcherServlet返回一个ModelAndVIew对象,ModelAndVIew对象中应该包含视图名或视图名和模型
    6、根据返回的ModelAndView对象那个,选择一个合适的ViewResolver(视图解析器),返回给DispatcherServlet
    7、ViewResolver结合Model和View来渲染视图
    8、将视图渲染结果返回给客户端

  • 相关阅读:
    【python+selenium】selenium grid(分布式)
    【python】导入自定义模块
    Maven的配置以及IDEA导入本地Maven
    java历史概述
    JVM 内存调优 与 实际案例
    ConcurrentHashMap实现线程安全的原理
    Request.UrlReferrer详解
    等比例缩放生成缩略图
    JavaEE的ajax入门
    javaee三层架构案例--简单学生管理系统
  • 原文地址:https://www.cnblogs.com/haizhilangzi/p/11026044.html
Copyright © 2020-2023  润新知