【SSM】SSM之SpringMVC框架:SpringMVC的工作原理

客户端发送的请求被DispatcherServlet捕获后其流程如下:

在这里插入图片描述
其大致流程如下:

  • 1、用户发送请求至前端控制器DispatcherServlet。

  • 2、DispatcherServlet收到请求调用HandlerMapping处理器映射器。

  • 3、处理器映射器如果没有找到具体的处理器:

    • 如果配置了<mvc:default-servlethandler/>,就调用默认的Servlet处理找到匹配的静态资源,如果没有找到就返回404页面;
    • 如果没配置<mvc:default-servlethandler/>,直接返回404页面。
  • 3、处理器映射器如果找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。

  • 4、执行处理器拦截器的preHandle()方法(如果有的话)。

  • 5、DispatcherServlet获得HandlerAdapter处理器适配器。

  • 5、HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。

  • 6、Controller执行完成返回ModelAndView前执行处理器拦截器的postHandle()方法(如果有的话)。

  • 7、Controller执行完成返回ModelAndView。

  • 8、HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。

  • 9、如果有异常,就调用HandlerExceptionResolver组件解析异常生成新的ModelAndView。

  • 10、DispatcherServlet将ModelAndView传给ViewReslover视图解析器。

  • 11、ViewReslover解析后返回具体View;

  • 12、DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。

  • 13、调用拦截器的afterCompletion()方法(如果有的话)。

  • 14、DispatcherServlet响应用户。

主要环节解释如下:

1、DispatcherServlet捕获请求后,首先查找匹配的handler方法:

  • DispatcherServlet捕获请求,执行到DispatcherServlet的doDispatch()方法时,在该方法中调用该类的getHandler()方法:
    在这里插入图片描述
  • 在该类的getHandler()方法中遍历所有的handlerMapping,逐个调用其getHandler()方法并将request作为实参传递进去:
    在这里插入图片描述
  • 在处理器映射器接口HandlerMapping的实现类AbstractHandlerMapping的getHandler()方法中,根据request获得一个HandlerExecutionChain对象并返回给DispatcherServlet的getHandler()方法,如果不为空就返回给doDispatch()方法中的HandlerExecutionChain类型的变量mappedHandler:
    在这里插入图片描述

2、如果未找到与请求相匹配的handler方法:

  • 如果配置了<mvc:default-servlethandler/>,就调用默认的Servlet处理找到匹配的静态资源,如果没有找到就返回404页面;
  • 如果没配置<mvc:default-servlethandler/>,直接返回404页面。

3、如果找到了与请求相匹配的handler方法,那么就获得了一个HandlerExecutionChain对象:

4、获取处理器适配器HandlerAdapter的实例化对象:

  • 调用DispatcherServlet中的getHandlerAdapter()方法获得一个处理器适配器HandlerAdapter的实例化对象ha,并同时将HandlerExecutionChain的实例化对象mappedHandler中存储的handler方法传递给处理器适配器ha:
    在这里插入图片描述
    在这里插入图片描述

5、执行拦截器中的preHandle()方法:

  • 利用HandlerExecutionChain的实例化对象mappedHandler来执行拦截器中的preHandle()方法,拦截器的工作流程可以参考拦截器分析
    在这里插入图片描述

6、执行handler方法:

  • 利用处理器适配器HandlerAdapter的实例化对象ha来执行匹配到的handler方法,在该方法中调用对应的方法来解析试图,并在解析后的视图返回给该变量之前执行拦截器的postHandle()方法:
    在这里插入图片描述

7、如果在执行handler方法期间抛出了异常

  • 那么在执行processDispatchResult()方法时将调用HandlerExceptionResolver 组件来解析异常,或者返回一个默认视图,或者返回一个自定义的异常视图,具体可以参考异常处理
    在这里插入图片描述

8、如果没有异常

  • 那么在执行processDispatchResult()方法时,会调用render()方法正常解析试图,并执行请求转发。render()方法内的流转,可以参考SpringMVC执行流程
    在这里插入图片描述

9、执行拦截器中的afterCompletion()方法:
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章