private Object view; 描述视图信息
private ModelMap model 描述模型数据(响应数据)
public void setViewName(String viewName) 设置视图信息
public ModelAndView addObject(String attributeName, Object attributeValue) 设置模型数据
protected Map
public ModelMap getModelMap() 获取模型数据
public Map
public String getViewName() 获取视图名字
[1]. 在DispatcherServlet的 945 行, 准备执行请求处理方法
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
[2]. 执行请求处理方法, 请求处理方法返回一个ModelAndView对象, 最终返回到DispatcherServlet的945行。
[3]. 在DispatcherServlet 959行, 开始处理结果:解析视图名字得到视图对象==>视图对象处理模型数据==>视图对象完成转发/重定向工作 .
processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
[4]. 在DispatcherServlet的1012行
render(mv, request, response);
[5]. 在DispatcherServlet的1204行,解析视图名字得到视图对象.当前的视图对象为: InternalResourceView
view = resolveViewName(mv.getViewName(), mv.getModelInternal(), locale, request);
[6].在DispatcherServlet1225行, 视图对象开始处理模型数据
view.render(mv.getModelInternal(), request, response);
说明: 视图对象的render()方法是在View接口中定义的。 该方法在View接口下面的一个抽象类 AbstractView中进行了具体的实现.
[7].在AbstractView中的266行, 开始整合输出模型数据,
renderMergedOutputModel(mergedModel, request, response);
说明: renderMergetOutputModel方法是AbstractView中的抽象方法, 该方法在不同的视图类中进行了不同的实现.
当前的视图对象时InternalResourceView, 接下来调用到InternalResouceView中的renderMergetOutputModel方法。
[8]. 在InternalResourceView中的180行,将模型数据设置到Request域对象中.
exposeModelAsRequestAttributes(model, requestToExpose);
[9]. 在InternalResourceView中的189行,获取转发器
RequestDispatcher rd = getRequestDispatcher(requestToExpose, dispatcherPath);[10].在InternalResourceView中的209行,开始转发.
rd.forward(requestToExpose, response);
首先,不论请求处理方法的返回值是String、ModelAndView等, Springmvc在调用完请求处理方法后,都会重新封装成一个ModelAndView对象.
接下来, 视图解析器对象 会解析ModelAndView中的view信息,得到具体的视图对象.
在然后, 视图对象会去处理模型数据, 并完成最终的转发以及重定向的工作。
String getContentType(); 主要用于设置响应头信息 response.setContentType(“text/html;charset=utf-8”);
void render(Map
视图对象处理模型数据.
View接口中的render()方法是在AbstractView中进行了统一的实现.
protected abstract void renderMergedOutputModel(
Map
throws Exception; 在不同的视图实现类中做了具体的实现,主要就是完成转发和重定向工作.
视图主要就是处理模型数据, 并完成最终的转发和重定向工作.
InternalResourceView 转发视图
JstlView 转发视图,是InternalResourceView的子类.
RedirectView 重定向视图
View resolveViewName(String viewName, Locale locale) throws Exception; 解析视图名字得到视图对象
视图解析器专门就是用于解析得到视图对象的.
InternalResourceViewResolver
默认值是int的最大值, 值越小优先级越高.
在请求处理方法的返回值前面添加 redirect: 前缀即可.
重定向的工作是由 RedirectView 来完成的.