本文最后更新于:2022年6月11日 下午
SpringMVC源码
Servlet中的service方法,然后调用doGet或者doPost方法;
调用processRequest方法—》调用DispatcherServlet的doService方法—》调用DispatcherServlet类中的doDispatch方法;
——》getHandler方法:进行映射,得到对应的HandlerMapping
——》getHandlerAdapter方法:遍历多种Adapter对得到的handler进行判断,能处理就处理,得到HandlerAdapter适配器处理器 ha
调用ha.handle()方法,真正调用handler。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| 在handle()方法中,调用handleInternal() 方法;
在ReqestMappingHandlerAdapter中: 调用ReqestMappingHandlerAdapter 的 handleInternal() 方法 判断当前请求是否是支持的; 判断是否要同步session(默认为false) invokeHandlerMethod()方法:对HandlerMethod进行参数的适配处理,并调用目标handler 做很多初始化操作;如设置参数解析器,设置返回值处理器 调用initModel()方法:调用标注了@ModelAttribute的方法,做一些初始化操作 对请求参数进行处理,调用invokeAndHandle()方法 调用invokeForRequest()方法:真正调用目标方法,返回Object类型对象 获取目标方法的参数,并解析参数; 调用目标方法,doInvoke(参数) 得到返回值 Object returnValue; 遍历所有的ReturnValueHandler,使用支持该类型的handler对当前类型的返回值进行解析; 最终返回mav,ModelAndView; 最终handle()方法返回mav, 回到DispatcherServlet类;
调用拦截器mappedHandler.applyPostHandle()方法; 执行processDispatchResult()方法,渲染视图; 调用render()方法,解析视图,渲染视图; resolveViewName()方法解析视图名; 遍历viewResolvers视图解析器,一个一个地去解析视图,解析成功返回view; 调用view.render()方法; 调用renderMergedOutputModel()方法; 调用exposeModelAsRequestAttributes(model, request)方法,将model设置到request的attribute中; 设置国际化资源; 防止死循环请求; 通过request拿到RequestDispatcher,调用getRequestDispatcher(request, dispatcherPath); rd.forward(request, response);
|
——》HandlerAdapter适配器处理器 解析参数、执行方法,解析返回值,并返回ModelAndView,