欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

深入理解Spring MVC开发-数据模型

程序员文章站 2022-07-15 11:41:49
...

上述章节只是谈到了参数的获取和转换,通过这些处理器终于可以调用控制器了。在Spring MVC中,控制器是业务逻辑的核心内容,而控制器的核心内容之一就是对数据的处理。通过上章对Spring MVC全流程的学习,可以看到允许控制器自定义模型和视图(ModelAndView),其中模型是存放数据的地方,视图则是展示给用户。本节暂时把视图放下,先来讨论数据模型的问题。

数据模型的作用是绑定数据,为后面的视图渲染做准备。首先对Spring MVC使用模型接口和类设计进行探讨,如下图
深入理解Spring MVC开发-数据模型
从途中可以看出ModelAndView中存在一个ModelMap类型的属性,ModelMap继承LinkedHashMap类,所以他具备Map接口的一切特性,除此之外它还可以增加数据属性。在Spring MVC的应用中,如果在控制器方法的参数中使用ModelAndView,Model或者ModelMap作为参数类型,Spring MVC会自动创建数据模型对象。代码如下:

package cn.hctech2006.boot.bootmvc.controller;

@Controller
@RequestMapping("/data")
public class DataModelController {
    //注入角色服务类
    @Autowired
    private SysRoleService sysRoleService;

    //测试Model接口
    @GetMapping("/model")
    public String sysRoleModel(Long id, Model model){
        SysRole sysRole = sysRoleService.findById(id);
        model.addAttribute("sysRole", sysRole);
        //这里返回字符串,在Spring MVC中会自动创建ModelAndVIew且绑定名称。
        return "data/role";
    }
    //测试modelMap
    @GetMapping("/modelMap")
    public ModelAndView sysRoleModelMap(Long id, ModelMap modelMap){
        SysRole sysRole = sysRoleService.findById(id);
        ModelAndView mv = new ModelAndView();
        mv.setViewName("data/role");
        //设置数据模型,此处的modelMap并没有与mv绑定,这部系统会自动处理
        modelMap.put("sysRole", sysRole);
        return mv;
    }
    //测试ModelAndView
    @GetMapping("/mav")
    public ModelAndView sysRoleModelAndView(Long id, ModelAndView mv){
        SysRole sysRole = sysRoleService.findById(id);
        //设置视图名称
        mv.setViewName("data/role");
        //设置数据模型
        mv.addObject("sysRole", sysRole);
        return mv;
    }
}

从这段代码中可以看出Spring MVC还是比较智能的,例如在sysRoleModel方法中,只是返回一个字符串,Spring MVC会自动生成对应的视图,并且绑定数据模型。又如,sysRoleModelMap方法,返回了ModelAndView对象,但是他没有绑定ModelMap对象,Spring MVC也会自动绑定他。

上述数据对象,无论使用哪一个都是允许的。只是他们都是渲染同一个视图,而且该视图逻辑名称为data/role,这样通过InternalResourceViewResolver的定位,就会找到对应的视图,然后把数据渲染到这个视图上。data.html代码如下

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8" http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>角色信息</title>
    <script src="https://code.jquery.com/jquery-3.2.0.js"></script>
</head>
<body>
    <table>
        <tr>
            <td>角色名</td>
            <td th:text="${sysRole.name}"></td>
        </tr>
    </table>
</body>
</html>

这样就可以测试这些内容了
地址http://localhost:8243/data/model?id=12
深入理解Spring MVC开发-数据模型