@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
- JavaScript 作用域 與 作用域鏈JavaScript
- js 作用域和作用域鏈JS
- js的作用域、作用域鏈JS
- js的作用域和作用域鏈JS
- javascript之作用域與作用域鏈JavaScript
- js的作用域與作用域鏈JS
- jdbc作用JDBC
- 作用域
- 詞法作用域和動態作用域
- Spring的作用域以及RequestContextListener作用SpringContext
- 原型、原型鏈、作用域、作用域鏈、閉包原型
- 深入理解JavaScript作用域和作用域鏈JavaScript
- Java中的volatile的作用和synchronized作用Javasynchronized
- JS語法作用域與詞法作用域JS
- Symbol 的作用Symbol
- javaScript 作用域JavaScript
- JavaScript作用域JavaScript
- jQuery $ 的作用jQuery
- switch default 作用
- js作用域JS
- rman crosscheck作用ROS
- DOCTYPE宣告作用
- #include的作用
- javascript作用域和作用域鏈簡單介紹JavaScript
- 深入理解javascript作用域系列第二篇——詞法作用域和動態作用域JavaScript
- 深入理解javascript系列(六):作用域與作用域鏈JavaScript
- JavaScript 深入之詞法作用域和動態作用域JavaScript
- 函式(三)作用域之變數作用域、函式巢狀中區域性函式作用域、預設值引數作用域函式變數巢狀
- http 代理的作用HTTP
- JS的作用域JS
- Hashcode的作用
- JS-作用域JS
- Java中Arrays作用Java
- Git分支的作用Git