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); }