@ModelAttribute作用
該註解具有如下三個作用:
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()
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()
相關文章
- @ModelAttribute 的使用
- SpringBoot @ModelAttribute 用法Spring Boot
- Spring: @ModelAttribute註解用法Spring
- @PathVariable @RequestParam @RequestBody @ModelAttribute的區別及RestTemplate呼叫方式REST
- 作用域及作用域鏈
- 作用域與作用域鏈
- js的作用域、作用域鏈JS
- JavaScript 作用域 與 作用域鏈JavaScript
- javascript之作用域與作用域鏈JavaScript
- js的作用域與作用域鏈JS
- js的作用域和作用域鏈JS
- 的作用
- SecondNamenode作用
- springFactoriesLoader作用Spring
- 作用域
- serialVersionUID作用UI
- SysTick作用
- 作用域、作用域鏈及閉包(一)
- 原型、原型鏈、作用域、作用域鏈、閉包原型
- 深入理解JavaScript作用域和作用域鏈JavaScript
- Symbol 的作用Symbol
- jQuery $ 的作用jQuery
- javaScript 作用域JavaScript
- js作用域JS
- JavaScript作用域JavaScript
- systemd的作用
- #include的作用
- condition的作用
- static的作用
- Hashcode的作用
- a===void 0 作用
- ContentPresenter 的作用
- CDN的作用
- for range 作用域
- @Deprecated 的作用
- 深入理解javascript系列(六):作用域與作用域鏈JavaScript
- 函式(三)作用域之變數作用域、函式巢狀中區域性函式作用域、預設值引數作用域函式變數巢狀
- CHECK_INTERFACE作用