Loading

spring mvc注解之@ModelAttribute

 

 

时间:2020/02/10

 

一.使用说明:

1.作用:该注解可以用于修饰方法和参数。出现在方法上,表示当前方法会在控制器的方法执行之前,先执行,它可以修饰没有返回值的方法,也可以修饰具有返回值的方法。出现在参数上,获取指定的数据给参数赋值。

 

2.属性:

value:用于获取数据的key,key可以是POJO的属性名称,也可以是map结构的key。

 

3.应用场景:当表单提交数据不是完整的实体数据时,保证没有提交数据的字段使用数据库对象原来的数据。例如:

我们在编辑一个用户时,用户有一个创建信息字段,该字段的值是不允许被修改的。在提交表单数据时肯定没有此字段的内容,一旦更新会把该字段内容置为null,此时就可以使用此注解解决问题。

 

 

二.使用示例

1.场景假设:假设数据库中存在一个用户信息表,该表有两个字段:昵称和年龄。现在有一个修改昵称的表单,因为该表单的目的只是修改昵称,所以表单中只有昵称一个字段,当我们在提交表单时,User对象的age属性肯定会被赋值为null(因为表单中没有该字段),为了使数据库中该用户的年龄信息依然为之前数据库中的值,这就需要在修改该字段之前先查出该用户之前的年龄值,然后赋值给User对象,这样就不会使数据中年龄字段的值变为null了。

 

2.代码:

User.class:

package sdnu.machi.dao;

import java.io.Serializable;

/**
 * User数据类
 */
public class User implements Serializable {

    private String uname;
    private int age;

    public String getUname() {
        return uname;
    }

    public void setUname(String uname) {
        this.uname = uname;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "uname='" + uname + '\'' +
                ", age=" + age +
                '}';
    }
}

 

2.SpringController.java

package sdnu.machi.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import sdnu.machi.dao.User;

@Controller
@RequestMapping("/test")
public class SpringController {

    @RequestMapping("/testModelAttribute")
    public String testModelAttribute(User user){
        System.out.println("testModelAttribute方法执行了。。。。");
        System.out.println(user);
        return "success";
    }

    @ModelAttribute
    public User test(String uname){
        User user = new User();
        user.setUname(uname);
        user.setAge(10);    //假设10这个值是从数据库中查出来的
        return user;
    }
}

 

3.index.jsp

<%--
  Created by IntelliJ IDEA.
  User: DELL
  Date: 2020/2/10
  Time: 18:53
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>首页</title>
</head>
<body>
    <h3>修改昵称</h3>

    <form action="test/testModelAttribute" method="post">
        昵称:<input type="text" name="uname"><br/>
        <input type="submit" value="提交"/>
    </form>

</body>
</html>

 

4.success.jsp

<%--
  Created by IntelliJ IDEA.
  User: DELL
  Date: 2020/2/10
  Time: 19:11
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>成功</title>
</head>
<body>

    <h3>修改成功</h3>

</body>
</html>

 

5.输出

 

 通过控制台的输出可以看到,age被赋了10

 

上面的user对象是通过返回值传递的,如果不使用返回值,则需要在@ModelAttribute注解作用的函数上增肌一个Map类型的参数,这个参数会自动传递给@RequestMapping注解所在的方法的,但是在@RequestMapping所在的方法的参数中假如@注解,具体代码如下:

@RequestMapping("/testModelAttribute")
    public String testModelAttribute(@ModelAttribute("one")User user){
        System.out.println("testModelAttribute方法执行了。。。。");
        System.out.println(user);
        return "success";
    }

    @ModelAttribute
    public void test(String uname, Map<String, User> map){
        User user = new User();
        user.setUname(uname);
        user.setAge(10);    //假设10这个值是从数据库中查出来的
        map.put("one", user);
    }

 

posted @ 2020-02-11 18:03    阅读(236)  评论(0编辑  收藏  举报