@ModelAttribute作用

Xpria發表於2018-07-10
該註解具有如下三個作用:


1.繫結請求引數到命令物件
例如在使用者登入時,我們需要捕獲使用者登入的請求引數(使用者名稱、密碼)並封裝為使用者物件,此時我們可以使用@ModelAttribute繫結多個請求引數到我們的命令物件。
public String test(@ModelAttribute("my_user") User u)

和上面接收到的"第五種"情況一樣,只是此處多了一個註解@ModelAttribute("my_user"),它的作用是將該繫結的命令物件以"my_user"為名稱新增到模型物件中供檢視頁面展示使用。我們此時可以在檢視頁面使用${my_user.username}來獲取繫結的命令物件的屬性。
如果不寫@ModelAttribute("my_user")這個註解,那麼預設新增到模型中的名字是該型別的類名首字母小寫,例如這裡便是user,頁面中取值就需要這樣${user.username}




2.在功能處理方法執行前,向模型中新增資料
@ModelAttribute("cityList")
public List<String> cityList(String username) {


return Arrays.asList("北京", "山東");
}
如果當前模型中沒有名字為cityList的資料時,如上程式碼會在執行處理器中任意功能處理方法之前執行,並將返回值自動新增到模型物件中,在功能處理方法中呼叫Model物件中的方法containsAttribute("cityList")將會返回true。

注意:模型中資料的作用範圍是request級別的
注意:此方法中依然是可以接收本次請求的引數的,預設和客戶端所傳引數名字保持一致,也可以使用@RequestParam指定引數名

注意:如何有倆個同名的命令物件,如下
@ModelAttribute("user")
public User getUser(String username) {
User user = new User();
user.setUsername("briup");
return user;
}

@RequestMapping(value="/model")
public String test1(@ModelAttribute("user") User user, Model model){
//輸出結果為briup
System.out.println(user.getUsername());


//返回值是true
System.out.println(user == model.asMap().get("user"));
return "index";
}

說明springMVC對於模型中重名的物件,不會重複建立,預設模型中已經有了這個名字的物件,那麼就直接拿出來使用



3.把功能處理方法的返回值新增到模型資料中
@RequestMapping(value="/index")
public @ModelAttribute("u") User test3(){
User user = new User();
user.setUsername("tom");
user.setPassword("123");
return user;
}


注意:這時候SpringMVC會根據RequestToViewNameTranslator進行邏輯檢視名的翻譯,這個例子中也就會把"index"作為邏輯檢視名進行解析

注意:對於集合型別(Collection介面的實現者們,包括陣列),生成的模型物件屬性名為"簡單類名(首字母小寫)"+"List",如List<String>生成的模型物件屬性名"stringList",List<User>生成的模型物件屬性名為"userList"。
例如:
public @ModelAttribute List<String> test()
public @ModelAttribute List<User> test()

相關文章