3.九、在方法上使用@ModelAttribute註解

  這一部分翻譯自 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

相關文章
相關標籤/搜索