springmvc:View和ViewResolver解析

springmvc由HandlerAdapter执行具体的handler后,返回的是ModelAndView对象,如何映射到具体的视图,生成页面返回到浏览器,就需要ViewResolver和View来操作了。
 
直接到DispatcherServlet里看源码:
springmvc:View和ViewResolver解析_第1张图片
springmvc:View和ViewResolver解析_第2张图片
springmvc:View和ViewResolver解析_第3张图片
这里可以看到ViewResolver会对viewName进行解析,得到View对象。
springmvc:View和ViewResolver解析_第4张图片
从类成员变量this.viewResolvers里循环解析viewName,得到匹配的View对象。
 
this.viewResolvers的赋值在DispatcherServlet的初始化时进行:
springmvc:View和ViewResolver解析_第5张图片
这里同样对viewResolver进行了排序,根据order属性。当有多个viewResovler可以对viewName进行解析时,会匹配order值较小的一个。
 
返回到DispatcherServlet中继续往下看:
springmvc:View和ViewResolver解析_第6张图片
得到View对象后,调用view.render()方法,对视图进行渲染,生成页面返回到客户端(浏览器)。
继续解析view.render()方法:
springmvc:View和ViewResolver解析_第7张图片
springmvc:View和ViewResolver解析_第8张图片
可以看到render()里最终是获取到servlet的RequestDispatcher,根据解析的视图进行rd.forward()。这里分析的是常用的InternalResourceView。不同的View类型render处理是不一样的。
 
再来看一个MappingJackson2JsonView:
springmvc:View和ViewResolver解析_第9张图片
可以看到,处理json的view会将model的数据转化成json,使用response的outputStream进行write(),输出到页面。
 
View和ViewResovler对视图渲染处理的基本流程就是这样。
后续会对DispatcherServlet的处理流程进行总结,以及对不同的HandlerMapping、HandlerAdapter、ViewResolver、View进行更详细的解析。
 

你可能感兴趣的:(spring)