這一部分翻譯自 Spring 5.0.0.M1 文檔中的 Using @ModelAttribute on a method 一節。這一節的演示示例在這個項目的 mvc 分支中的 ModelAttrController.java 文件中。html
註解@ModelAttribute
能夠用在方法或者方法參數上。這一節解釋它用在方法上,下一節解釋把它用在方法參數上。java
用在方法上的@ModelAttribute
指示那個方法的目的是添加一個或多個模型屬性(model attributes)。這樣的方法和@RequestMapping
方法支持的參數類型相同,可是不能直接映射到請求。在控制器中的@ModelAttribute
方法的調用時機是在同一個控制器中的@RequestMapping
方法以前。下面是幾個例子:git
// 添加一個屬性 // 這個方法的返回值被添加到名爲 「account」 的模型下 // 你能夠自定義這個名字,像這樣 @ModelAttribute("myAccount") @ModelAttribute public Account addAccount(@RequestParam String number) { return accountManager.findAccount(number); } // 添加多個屬性 @ModelAttribute public void populateModel(@RequestParam String number, Model model) { model.addAttribute(accountManager.findAccount(number)); // add more ... }
@ModelAttribute
方法用於構建帶有經常使用屬性的模型,好比用狀態或者寵物類型填充一個下拉框,或者取回一個命令對象如 Account,把它用做 HTML 表單數據。後一種狀況在下一節會進行更深刻的討論。spring
注意,有兩種形式的@ModelAttribute
方法。第一種,方法經過返回屬性來隱式地添加屬性。第二種,方法接受一個Model
參數,並把任何數量的屬性添加給它。你能夠根據須要選擇其中的任何一種。mvc
一個控制器能夠有任何數量的@ModelAttribute
方法。全部的這些方法都在同一個控制器中的@RequestMapping
方法以前調用。【很遺憾,我如今尚未找到關於一個控制器中有多個@ModelAttribute
方法時,這些方法的調用順序的說明。之後找到的話會補上】app
@ModelAttribute
方法也能夠定義在一個帶有@ControllerAdvice
註解的類中,這些方法應用於不少控制器。詳情參見「使用@ControllerAdvice
和@RestControllerAdvice
通知控制[2]」一節 .net
在不顯式指定屬性名的時候發生了什麼?這種狀況下,被賦值的模型屬性的缺省名稱是基於其類型的。好比,若是一個方法返回一個 Account 類型的對象的話,那麼缺省名就是「account」。你能夠經過註解@ModelAttribute
的值來改變。若是直接添加屬性到模型的話,請使用合適的方法 addAttribute(..) 的重載。翻譯
註解@ModelAttribute
也能夠用在@RequestMapping
方法上。這種狀況下,@RequestMapping
方法的返回值被攔截爲一個模型屬性,而不是一個視圖名。關於視圖,參見源文檔的18.13.3節「視圖——RequestToViewNameTranslator」。code