首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Spring MVC @ModelAttribute 註解深度解析:解決表單提交屬性缺失問題

     編輯:Java 相關知識

問題場景

當表單只提交 name、address、age 三個欄位,但實體類還包含 pass 等其他屬性時,直接綁定會導致未提交的屬性變成 null,造成資料遺失。

表單提交缺少pass屬性 pass屬性為null

@ModelAttribute 解決方案

@ModelAttribute
public void getUsers(@RequestParam(value="name", required=false) String name, Map<String, Object> map) {
    if (name != null) {
        System.out.println("調用 ModelAttribute");
        // 模擬從資料庫查詢完整物件
        User users = new User("cjh", "123", "123@qq.com", "China");
        System.out.println("從資料庫獲取物件:" + users);
        map.put("user", users); // key 必須與目標方法參數名一致
    }
}

@RequestMapping("/getInfo")
public String getServletAPI(User user) {
    System.out.println("修改後的物件:" + user);
    return "hello";
}

執行流程解析

  1. 先執行 @ModelAttribute 方法:從資料庫查詢完整物件,放入 Map,key 必須與目標方法參數名相同(此處為 user)
  2. Spring MVC 從 Map 取出物件:將表單提交的參數覆蓋到該物件上(僅覆蓋表單有的欄位,缺失的保持原值)
  3. 將合併後的物件傳入目標方法:得到既保留資料庫原有值,又更新表單值的完整物件

關鍵注意事項

  • @ModelAttribute 修飾的方法會在該控制器的每個請求方法執行前都執行一次
  • Map 的 key 名稱必須與 @RequestMapping 方法的參數名完全一致
  • 適用於「編輯/更新」場景:先載入原資料,再合併表單提交

執行效果

pass屬性保留原值

最終 pass 保持資料庫原值 123,未被覆蓋為 null。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved