• 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是一个逻辑视图,对于逻辑视图而言它需要一个视图解析器






  • 相关阅读:
    git --> 工作使用流程
    json-server-----》基本使用
    laravel DB listen 回调追踪产生 sql 语句的代码
    lumen 使用 laravel-cors 的时候, 使用 dd 函数的解决方法
    js 读写 cookie 简单实现
    API Authentication Error: {"error":"invalid_client","message":"Client authentication failed"}
    lumen passport Call to undefined method LaravelLumenApplication::group()
    laravel 嵌套事务
    mysql 5.7 json 字段类型查找、修改
    dingo 内部调用获取异常信息
  • 原文地址:https://www.cnblogs.com/ooo0/p/11109060.html
Copyright © 2020-2023  润新知