面试怎么说—SpringMvc的执行流程 含源码分析

image-20190717165241346

相关类解释

DispatchServlet  中央处理器 负责处理请求 并且响应结果

HandlerExecutionChain 处理器执行器链 封装了处理器 和 拦截器

Handler 处理器的对象 即Controller

HandlerAdapter 确定到底使用哪个Controller处理请求

ModelAndView 包含模型数据  和 视图 index

执行流程

  1. 页面发送请求

  2. DispatchServlet 会拦截请求进行处理

  3. 调用HandlerMapping 获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain对象的形式返回

    image-20190717195028606
  4. 还是在DispatcherServlet中 根据获得的Handler 得到 HandlerAdapter

    image-20190717195755952
  5. 执行Handler

    image-20190717195911447
    image-20190717195951995
    image-20190717200020866
    image-20190717200139250

    HttpMessageConveter: 将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息

    HttpMessageConveter: 将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息;
    
    数据转换:对请求消息进行数据转换。如String转换成Integer、Double等;
    
    数据根式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等;
    
    数据验证: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中。
    
  6. Controller执行结束会响应一个ModelAndView 在DispatchServlet中拿到ModelAndView 调用render方法 处理ModelAndView

    image-20190717200420999
  7. 根据返回的ModelAndView,选择一个适合的ViewResolver(必须是已经注册到Spring容器中的ViewResolver)

    获取视图的名字

    image-20190717200615974
    image-20190717200723727
    image-20190717200824110
    image-20190717200844208

    得到View

    image-20190717201216459
  8. 获取转发对象

    image-20190717200953008
    image-20190717201018570

我不能保证每一个地方都是对的,但是可以保证每一句话,每一行代码都是经过推敲和斟酌的。希望每一篇文章背后都是自己追求纯粹技术人生的态度。

永远相信美好的事情即将发生。