SpringMVC笔记

本文最后更新于: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()方法解析视图名;// 为最初的视图名称拼接上了前缀和后缀, 设置了contentType
遍历viewResolvers视图解析器,一个一个地去解析视图,解析成功返回view;
调用view.render()方法;
调用renderMergedOutputModel()方法;
调用exposeModelAsRequestAttributes(model, request)方法,将model设置到request的attribute中; // 将model中的name和value解析出来,并设置到request.setAttribute()中。
设置国际化资源;
防止死循环请求;
通过request拿到RequestDispatcher,调用getRequestDispatcher(request, dispatcherPath);// 通过一个请求和一个地址,获得RequestDispatcher rd
rd.forward(request, response); // RequestDispatcher.forward直接转发


——》HandlerAdapter适配器处理器 解析参数、执行方法,解析返回值,并返回ModelAndView,


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!