spring的@ModelAttribute作用
最近好忙,幾乎沒有時間閱讀和記錄,主要是由于公司把項目由php開始轉到java陣營了。這讓從php起步的我來說,多少伴随着重新使用一門語言的陌生感。
不過,伴随着陌生感的,還有久違的新鮮感,我個人非常喜歡這種趕腳,仿佛重新找到了一片淨土~~
廢話不多說,忙裡抽閑,記錄一下這幾天學習到的新姿勢:@ModelAttribute注解
這個注解來自Spring,主要用于MVC中的Model對象(用于儲存資料模型),從這個解釋來看并不覺得有什麼複雜的,但是貌似它的用法比較多,下面轉載幾個看到的例子~
例子1:注解傳回類型為void的方法
@Controller
public class HelloWorldController {
@ModelAttribute
public void populateModel(@RequestParam String name, Model model) {
model.addAttribute("who", name);
}
@RequestMapping(value = "/helloWorld")
public String helloWorld() {
return "helloWorld";
}
}
上面的代碼,在擷取請求/helloWorld後,populateModel方法會在helloWorld方法之前被調用,它把請求參數kazaff(/helloWorld?name=kazaff)指派到model的名為who的鍵中,在它執行後,helloWorld方法才會被調用,傳回的Model就是由@ModelAttribute注解的方法建立的。
這個例子純粹用于示範@ModelAttribute,實際中我想沒人會這麼用~~
例子2:注解傳回具體對象的方法
@ModelAttribute
public Account addAccount(@RequestParam String name) {
return accountManager.findAccount(name);
}
這種用于主要用于和例子1進行比較,它直接傳回的Account類型的對象會隐式的指派給model對象的account鍵中,我個人感覺這一點其實并不那麼實用。
例子3:帶Value參數的注解傳回具體對象的方法
@Controller
public class HelloWorldController {
@ModelAttribute("who")
public String addAccount(@RequestParam String name) {
return name;
}
@RequestMapping(value = "/helloWorld")
public String helloWorld() {
return "helloWorld";
}
}
這個例子應該沒什麼好說的了,大家推測也能得到結果!
上面的三個例子對@ModelAttribute的用法我個人覺得比較另類,被@ModelAttribute注解的方法會在此Controller中每個映射URL的方法執行之前被執行,可見靈活度太差。
例子4:@ModelAttribute和@RequestMapping同時注釋一個方法
@Controller
public class HelloWorldController {
@RequestMapping(value = "/helloWorld")
@ModelAttribute("who")
public String helloWorld() {
return "kazaff";
}
}
注意,這麼寫的話,helloWorld方法的傳回值并不表示一個視圖名稱,而是表示model的一個鍵值,視圖名稱由RequestToViewNameTranslator根據請求的URL轉換為邏輯視圖名稱,上例中為helloWorld。
例子5:注解方法的參數
@Controller
public class HelloWorldController {
@ModelAttribute("user")
public User addAccount() {
return new User("kazaff","kazaff.me");
}
@RequestMapping(value = "/helloWorld")
public String helloWorld(@ModelAttribute("user") User user) {
return "helloWorld";
}
}
上例中,參數user的值來源于addAccount方法的傳回值。
例子6:抽風用法
@Controller
public class HelloWorldController {
@RequestMapping(value = "/helloWorld")
public String helloWorld(@ModelAttribute User user) {
return "helloWorld";
}
}
這種用法是我最開始看到的,其實這種寫法的話,完全可以省略掉這個注解!Spring可以直接把請求中攜帶的資料轉換成User類型的對象。