zoukankan      html  css  js  c++  java
  • Spring MVC 数据模型与视图

       从控制器获取数据后,会装载数据到数据模型和视图中,然后将视图名称转发到视图解析器中,通过解析器解析后得到最终视图,最后将数据模型渲染到视图中,展示最终的结果给用户。
      用ModelAndView来定义视图类型,包括JSON视图,也用它来加载数据模型。ModelAndView有一个类型为ModelMap的属性model,而ModelMap继承了LinkedHashMap<String, Object>,因此它可以存放各种键值对,为了进一步定义数据模型功能,Spring还创建了类ExtendedModelMap,这个类实现了数据模型定义的Model接口,并且还在此基础上派生了关于数据绑定的类——BindAwareModelMap,它们的关系如图15-12所示。


      在控制器的方法中,可以把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;
    }
      在笔者的测试中,无论使用Model还是ModelMap,它都是BindingAwareModelMap实例,而BindingAwareModelMap是一个继承了ModelMap,实现了Model接口的类,所以就有了相互转换的功能。而getRoleByModel和getRoleByModelMap都没有把数据模型绑定给视图和模型,这一步是Spring MVC在完成控制器逻辑后,自动绑定的,并不需要我们绑定,也就没有绑定的代码了。 
     

    视图

       视图是展示给用户的内容,而在此之前,要通过控制器得到对应的数据模型,如果是非逻辑视图,则不会经过视图解析器定位视图,而是直接将数据模型渲染便结束了;而逻辑视图则要对其进一步解析,以定位真实视图,这就是视图解析器的作用了。而视图则是把从控制器查询回来的数据模型进行渲染,以显示给请求者查看。
      在Spring MVC中实现视图的类很多,比如JSTL视图JstlView,JSON视图MappingJackson2JsonView,PDF视图AbstractPdfView等,通过它们的render方法,Spring MVC就可以将数据模型渲染成为各类视图,以满足各种需求。图15-13就是常用的视图类和它们之间的关系,通过这些Spring MVC就能够支持多种视图渲染了。


      视图又分为逻辑视图和非逻辑视图,比如MappingJack-son2JsonView是一个非逻辑视图,它的目的就是将数据模型转换为一个JSON视图,展现给用户,无须对视图名字再进行下一步的解析
    InternalResourceView是一个逻辑视图,对于逻辑视图而言它需要一个视图解析器






  • 相关阅读:
    OutputCache 缓存key的创建 CreateOutputCachedItemKey
    Asp.net Web Api源码调试
    asp.net mvc源码分析DefaultModelBinder 自定义的普通数据类型的绑定和验证
    Asp.net web Api源码分析HttpParameterBinding
    Asp.net web Api源码分析HttpRequestMessage的创建
    asp.net mvc源码分析ActionResult篇 RazorView.RenderView
    Asp.Net MVC 项目预编译 View
    Asp.net Web.config文件读取路径你真的清楚吗?
    asp.net 动态创建TextBox控件 如何加载状态信息
    asp.net mvc源码分析BeginForm方法 和ClientValidationEnabled 属性
  • 原文地址:https://www.cnblogs.com/ooo0/p/11109060.html
Copyright © 2011-2022 走看看