ModelAndView底层处理过程:
[1]. 在 DispatcherServlet 中 945 行 , 开始调用请求处理方法.
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
[2]. 执行请求处理方法, 方法执行完成以后,返回一个ModelAndView对象 . 最终返回到 DispatcherServlet 中的 945 行.
[3]. 在DispatcherServlet的959 行, 开始处理Dispatch的结果. 实际就是准备开始处理ModelAndView对象.
processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
[4]. 在DispatcherServlet的 1012行, 真正开始对ModelAndView对象进行处理.
render(mv, request, response);
[5]. 在DispatcherServlet的1204行, 通过解析视图名字,得到视图对象.
view = resolveViewName(mv.getViewName(), mv.getModelInternal(), locale, request);
当前得到的视图对象为:
[6]. 在DispatcherServlet的1225行, 视图对象开始处理模型数据.
view.render(mv.getModelInternal(), request, response);
注意: render()方法是View接口中的抽象方法, 该抽象方法在AbstractView中做了统一的实现, 任何一个视图对象将来都调用AbstractView中的render方法.
[7]. 在AbstractView中的266行, 具体处理模型数据.
renderMergedOutputModel(mergedModel, request, response);
注意: renderMergedOutputModel 是AbstractView中的抽象方法, 该方法在每个具体的视图类中做了不同的实现。
因为当前解析得到的视图对象是InternalResourceView, 因此会调用到InternalResourceView的renderMergedOutputModel 方法。
[8]. 在IntrenalResourceView中的 180行, 将模型数据存储到Request域对象中.
exposeModelAsRequestAttributes(model, requestToExpose);
[9]. 在IntrenalResourceView中的 189行, 获取转发器
RequestDispatcher rd = getRequestDispatcher(requestToExpose, dispatcherPath);
[10].在IntrenalResourceView中的 209行,开始转发
rd.forward(requestToExpose, response);
ModelAndView底层处理过程:
最新推荐文章于 2021-06-30 08:51:52 发布