天天看點

springmvc 在方法上使用 @ModelAttribute 注解

@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(..) 重載方法。也就是說,帶不帶屬性名都可以。

繼續閱讀