@ModelAttribute注解不僅可以用在方法上也可以用在方法參數上。本節講述@ModelAttribute在方法上的使用,下一節将講述其在方法參數上的使用。
在方法上使用 @ModelAttribute 注解的目的是添加一個或者多個model屬性中。這些方法支援@RequestMapping方法對應的參數,但是不能直接和請求映射。 在同一個Controller中@ModelAttribute 注解的方法将先于@RequestMapping注解的方法被調用。請看下面的例子:
1. // 添加一個屬性
2.
3. // 方法的傳回值以”account”作為鍵添加到了model中
4.
5. // 你可以通過 @ModelAttribute("myAccount")來指定名稱
6.
7.
8.
9. @ModelAttribute
10.
11. public Account addAccount(@RequestParam String number) {
12.
13. return accountManager.findAccount(number);
14.
15. }
16.
17.
18.
19. // 添加多個屬性
20.
21.
22.
23. @ModelAttribute
24.
25. public void populateModel(@RequestParam String number, Model model) {
26.
27. model.addAttribute(accountManager.findAccount(number));
28.
29. // add more ...
30.
31. }
@ModelAttribute 方法用來将一般屬性填充到model 中,如用狀态或者寵物類型填充下拉清單,或者用來恢複一個如Account指令對象用來表示html表單中的資料。後一種情況在下一節中将作詳細闡述。
請注意兩種@ModelAttribute方法風格,第一種:通過傳回對象添加屬性。第二種:方法含有Model作為參數,通過Model來添加任何數量的屬性。你可以根據需要去選擇。
一個controller(控制器)可以含有任意數量的 @ModelAttribute方法。同一個controller中所有這些方法在将先于 @RequestMapping 方法調用。
@ModelAttribute 也可以定義在被@ControllerAdvice注解的類中,這些方法将被應用到很多controller中。想了解更多相關資訊請看:
“Advising controllers with the @ControllerAdvice“這一節。
提示:
如果一個model attribute(模型屬性)名沒有被明确指定會怎樣?
在這種情況下,将高根據模型屬性的類型來配置設定預設的名稱。例如,如果方法傳回一個Account類型的對象,預設模型屬性名是"account". 你可以通過修改 @ModelAttribute 注解的value來修改模型屬性的名稱。如果想把屬性直接添加到Model中.你可以使用适當的addAttribute(..) 重載方法。也就是說,帶不帶屬性名都可以。