从控制器获取数据后,会装载数据到数据模型和视图中,然后将视图名称转发到视图解析器中,通过解析器解析后得到最终视图,最后将数据模型渲染到视图中,展示最终的结果给用户。
用ModelAndView来定义视图类型,包括JSON视图,也用它来加载数据模型。ModelAndView有一个类型为ModelMap的属性model,而ModelMap继承了LinkedHashMap<String, Object>,因此它可以存放各种键值对,为了进一步定义数据模型功能,Spring还创建了类ExtendedModelMap,这个类实现了数据模型定义的Model接口,并且还在此基础上派生了关于数据绑定的类——BindAwareModelMap,它们的关系如图15-12所示。
用ModelAndView来定义视图类型,包括JSON视图,也用它来加载数据模型。ModelAndView有一个类型为ModelMap的属性model,而ModelMap继承了LinkedHashMap<String, Object>,因此它可以存放各种键值对,为了进一步定义数据模型功能,Spring还创建了类ExtendedModelMap,这个类实现了数据模型定义的Model接口,并且还在此基础上派生了关于数据绑定的类——BindAwareModelMap,它们的关系如图15-12所示。
![](https://img2018.cnblogs.com/blog/1003856/201906/1003856-20190630110541052-849811631.png)
![](file:///c:/users/tl19638/appdata/local/ynote/data/qq497280d655f3ba3130a929d02569526b/673afbc88c0c4306b03a318778e041ab/clipboard.png)
在控制器的方法中,可以把ModelAndView、Model、ModelMap作为参数。在Spring MVC运行的时候,会自动初始化它们,因此可以选择ModelMap或者Model作为数据模型。事实上Spring MVC创建的是一个BindingAwareModelMap实例,根据图15-12的关系,可以通过强制转换把Model变为ModelMap,或者把ModelMap转换为Model。ModelAndView初始化后,Model属性为空,当调用它增加数据模型的方法后,会自动创建一个ModelMap实例,用以保存数据模型,至此数据模型之间的关系介绍清楚了,让我们用于实践。
代码清单15-41:测试数据模型
@RequestMapping(value = "/getRoleByModelMap", method = RequestMethod.GET) public ModelAndView getRoleByModelMap(@RequestParam("id") Long id, ModelMap modelMap) { // Role role = roleService.getRole(id); Role role = new Role(id, "射手", "远程物理输出"); ModelAndView mv = new ModelAndView(); mv.setViewName("roleDetails"); modelMap.addAttribute("role", role); return mv; } @RequestMapping(value = "/getRoleByModel", method = RequestMethod.GET) public ModelAndView getRoleByModel(@RequestParam("id") Long id, Model model) { // Role role = roleService.getRole(id); Role role = new Role(id, "射手", "远程物理输出"); ModelAndView mv = new ModelAndView(); mv.setViewName("roleDetails"); model.addAttribute("role", role); return mv; } @RequestMapping(value = "/getRoleByMv", method = RequestMethod.GET) public ModelAndView getRoleByMv(@RequestParam("id") Long id, ModelAndView mv) { // Role role = roleService.getRole(id); Role role = new Role(id, "射手", "远程物理输出"); mv.setViewName("roleDetails"); mv.addObject("role", role); return mv; }
视图
视图是展示给用户的内容,而在此之前,要通过控制器得到对应的数据模型,如果是非逻辑视图,则不会经过视图解析器定位视图,而是直接将数据模型渲染便结束了;而逻辑视图则要对其进一步解析,以定位真实视图,这就是视图解析器的作用了。而视图则是把从控制器查询回来的数据模型进行渲染,以显示给请求者查看。
在Spring MVC中实现视图的类很多,比如JSTL视图JstlView,JSON视图MappingJackson2JsonView,PDF视图AbstractPdfView等,通过它们的render方法,Spring MVC就可以将数据模型渲染成为各类视图,以满足各种需求。图15-13就是常用的视图类和它们之间的关系,通过这些Spring MVC就能够支持多种视图渲染了。
在Spring MVC中实现视图的类很多,比如JSTL视图JstlView,JSON视图MappingJackson2JsonView,PDF视图AbstractPdfView等,通过它们的render方法,Spring MVC就可以将数据模型渲染成为各类视图,以满足各种需求。图15-13就是常用的视图类和它们之间的关系,通过这些Spring MVC就能够支持多种视图渲染了。
![](https://img2018.cnblogs.com/blog/1003856/201906/1003856-20190630110711965-1476556401.png)
![](file:///c:/users/tl19638/appdata/local/ynote/data/qq497280d655f3ba3130a929d02569526b/fb963ec8d5fd48be9e0842e3f63918ce/clipboard.png)
视图又分为逻辑视图和非逻辑视图,比如MappingJack-son2JsonView是一个非逻辑视图,它的目的就是将数据模型转换为一个JSON视图,展现给用户,无须对视图名字再进行下一步的解析
InternalResourceView是一个逻辑视图,对于逻辑视图而言它需要一个视图解析器