客户端发送的请求被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()方法:
来源:CSDN
作者:景谦Nice
链接:https://blog.csdn.net/qq_43705275/article/details/104588649