发起请求后首先达到DispatcherServlet的doService()方法,然后到doDispatcher()方法,以下是doDispatcher()的主要执行步骤:
获取handlerMapping用于映射请求到controller;
通过handlerMapping获得handlerAdapter;
使用handlerAdapter执行要调用的controller;
根据controller返回的结果进行渲染(设置传给前端的参数、添加页面添加前缀/后缀、避免死循环等);
1、获取处理请求映射的handlerMapping,我们通常用的注解如:@RequestMapping等对应的handlerAdapter就是RequestMappingHandlerAdapter,其他几个HandlerAdapter只有特别说明才会用到
2、handlerMapping中的mapping.getHandler 将请求解析,得到controller类对应的类和方法
3、通过handlerMapping得到handlerAdapter,因为controller有不同的返回值,如modelAndView、responseBody、视图等,不同的handlerAdapter用来解析不同的返回值
4、DispatcherServlet中的源码 ha.handle(processedRequest, response, mappedHandler.getHandler()); 用来执行controller的方法并返回;
5、通过java反射执行controller的方法
执行方法前通过反射将参数赋值给接收参数的po(代码比较深)
6、返回视图后需要对视图进行渲染(方法 processDispatchResult),如添加前缀、后缀、避免死循环等