1、springboot2.0下的DispatcherServlet代码跟踪:
客户端发送请求,调用DispatcherServlet的service(),此方法继承于Servlet(DispatcherServlet extends FrameworkServlet ,FrameworkServlet extends HttpServletBean,HttpServletBean extends HttpServlet,HttpServlet extends GenericServlet,GenericServlet extends Servlet),并且在HttpServlet重写了service(),这个方法中对get/post/head/put等请求进行处理,并调用相应的doGet/doPost/doHead/doPut等方法,在FrameworkServlet中对这些方法进行了重写,doGet/doPost/doHead/doPut等方法最终调用processRequest();此方法中最终调用了doService();DispatcherServlet重写了doService(),在此方法中调用doDispatch()进行请求分发
doDispatch通过调用getHandler方法得到处理器(Controller),调用getHandlerAdapter方法得到适配器
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());这行代码最终调用RequestMappingHandlerAdapter的handleInternal方法
最终通过invokeHandlerMethod方法里面的invocableMethod.invokeAndHandle(webRequest, mavContainer)调用对应的处理器,即执行控制类的业务逻辑代码。
2、SpringMVC的运行流程:
⑴ 用户发送请求至前端控制器DispatcherServlet
⑵ DispatcherServlet收到请求调用HandlerMapping处理器映射器。
⑶ 处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
⑷ DispatcherServlet通过HandlerAdapter处理器适配器调用处理器
⑸ 执行处理器(Controller,也叫后端控制器)。
⑹ Controller执行完成返回ModelAndView
⑺ HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
⑻ DispatcherServlet将ModelAndView传给ViewReslover视图解析器
⑼ ViewReslover解析后返回具体View
⑽ DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。
⑾ DispatcherServlet响应用户。从上面可以看出,DispatcherServlet有接收请求,响应结果,转发等作用。有了DispatcherServlet之后,可以减少组件之间的耦合度。