1. 程式人生 > 實用技巧 >使用@ModelAttribute來獲取請求中的資料

使用@ModelAttribute來獲取請求中的資料

@ModelAttribute註解用於將方法的引數或者方法的返回值繫結到指定的模型屬性上,並返回給web檢視。

  在實際工作中,有些時候我們在修改資料的時候可能只需要修改其中幾個欄位,而不是全部的屬性欄位都獲取,那麼當提交屬性的時候,從form表單中獲取的資料就有可能只包含了部分屬性,此時再向資料庫更新的時候,肯定會丟失屬性,因為物件的封裝是springmvc自動幫我們new的,所以此時需要先將從資料庫獲取的物件儲存下來,當提交的時候不是new新的物件,而是在原來的物件上進行屬性覆蓋,此時就需要使用@ModelAttribute註解。

定義User bean物件:

package com.test.bean;

public class User { private Integer id; private String name; private String password; private Integer age; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; }
public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public Integer getAge() { return age; } public void setAge(Integer age) {
this.age = age; } @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + ", password='" + password + '\'' + ", age=" + age + '}'; } }

定義控制器UserController:

package com.test.controller;

import com.test.bean.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class UserController {

    Object o1 = null;
    Object o2 = null;
    Object o3 = null;

    @RequestMapping("update")
    public String update(@ModelAttribute("user") User user,Model model){
        System.out.println(user);
        o2 = model;
        //可以看到所有的model都是同一個物件
        System.out.println(o1==o2);
        //可以看到儲存的user物件也是同一個
        System.out.println(user == o3);
        return "output";
    }

    @ModelAttribute
    public void MyModelAttribute(Model model){
        o1 = model;
        User user = new User();
        user.setId(1);
        user.setName("user01");
        user.setAge(12);
        user.setPassword("123");
        model.addAttribute("user",user);
        System.out.println("modelAttribute:"+user);
        o3 = user;
    }
}

index.jsp:

<%--
  Created by IntelliJ IDEA.
  User: root
  Date: 2020/3/11
  Time: 13:45
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  <form action="update" method="post">
    <input type="hidden" value="1" name="id">
    姓名:user01<br>
    密碼:<input type="text" name="password"><br>
    年齡:<input type="text" name="age"><br>
    <input type="submit" value="提交">
  </form>
  </body>
</html>

總結:

1、方法的引數使用引數的型別首字母小寫,或者使用@ModelAttribute("")的值

2、先看之前是否在model中設定過該屬性值,如果設定過就直接獲取

3、看@SessionAttributes註解標註類中的方法是否給session中賦值,如果有的話,也是直接獲取,沒有報異常