SpringMVC标签之ModelAttribute

来源:互联网 发布:阿里巴巴e助手软件 编辑:程序博客网 时间:2024/06/05 20:46

首先要了解@ModelAttribute标签使用的场景:

  1. 比如我们在对表单数据进行修改操作的时候,有一些值是不容许被修改的(比如录入时间),从前台表单只对对象中部分属性值进行赋值,这样进行的update操作会把没有被赋值的属性就赋值为null,这样的操作是错误的。

  2. 为了解决这一问题,我们先将对象从数据库中查出,然后再进行从前端页面赋值,这样没有被赋值的属性依然是数据库原来的值,这样进行update操作就不会有问题。

@ModelAttribute标签就能帮我们解决这个问题,看示例:
前端页面代码:

<!--          模拟修改操作        1. 原始数据为: 1, Tom, 123456,tom@atguigu.com,12        2. 密码不能被修改.        3. 表单回显, 模拟操作直接在表单填写对应的属性值    -->    <form action="${pageContext.request.contextPath}/testModelAttribute" method="Post">        <input type="hidden" name="id" value="1"/>        username: <input type="text" name="username" value="Tom"/>        <br>        email: <input type="text" name="email" value="tom@haha.com"/>        <br>        age: <input type="text" name="age" value="12"/>        <br>        <input type="submit" value="Submit"/>    </form>

有 @ModelAttribute 标记的方法:

/** * 1. 有 @ModelAttribute 标记的方法, 会在每个目标方法执行之前被 SpringMVC 调用!  * 2. @ModelAttribute 注解也可以来修饰目标方法 POJO 类型的入参, 其 value 属性值有如下的作用: * 1). SpringMVC 会使用 value 属性值在 implicitModel 中查找对应的对象, 若存在则会直接传入到目标方法的入参中. * 2). SpringMVC 会以 value 为 key, POJO 类型的对象为 value, 存入到 request 中.  */@ModelAttributepublic void getUser(@RequestParam(value="id",required=false) Integer id,     Map<String, Object> map){    System.out.println("modelAttribute 方法");    if(id != null){        //模拟从数据库中获取对象        User user = new User(1, "Tom", "123456", "tom@haha.com", 12);        System.out.println("从数据库中获取一个对象: " + user);         map.put("user", user);    }}

目标方法:

/**  * 运行流程:  * 1. 执行 @ModelAttribute 注解修饰的方法: 从数据库中取出对象, 把对象放入到了 Map 中. 键为: user  * 2. SpringMVC 从 Map 中取出 User 对象, 并把表单的请求参数赋给该 User 对象的对应属性.这里没有赋值的属性还是数据库中的值.  * 3. SpringMVC 把上述对象传入目标方法的参数.   *注意:如果目标方法的入参没有用@ModelAttribute修饰, 在 @ModelAttribute 修饰的方法中, 放入到 Map 时的键需要和目标方法入参类型的第一个字  母小写的字符串一致!  **/ @RequestMapping("/testModelAttribute")public String testModelAttribute(@ModelAttribute("user")  User user){    System.out.println("目标方法");    System.out.println("修改: " + user);    return SUCCESS;}

运行结果:

从数据库中获取一个对象: User [id=1, username=Tom, password=123456, email=tom@haha.com, age=12]修改: User [id=1, username=Tom, password=123456, email=tom@haha.com, age=15]
1 0