你必定知道Model類,在控制器中,數據會存放到Model對象中,當須要生成HTML的時候,模板引擎會根據名字來定位數據,向下圖這樣。html
從廣義上來講,Model指的是MVC中的M,即Model(模型)。從狹義上講,Model就是個key-value集合。實際上,上圖home方法獲得的model對象就是一個 java.util.Map
,你能夠將Model類型替換爲Map<String, Object>
,或者ModelMap——一個實現了Model接口的java.util.HashMap
。java
往Model裏放數據還有另一種方式,使用ModelAndView。正如它的名字同樣,ModelAndView將Model和視圖名綁定在一塊兒,做爲請求處理方法的返回值。web
有的人會傾向於這種寫法。由於請求處理方法(上圖的home方法)的參數,一般是帶有「輸入(input)」的含義的,好比咱們以前介紹的@RequestParam和@PathVariable,好比咱們沒有介紹過的@RequestHeader和@CookieValue,他們都是一個請求的「輸入」,一般不會變。若是將Model類做爲請求處理方法的參數,而且去改變他,可能有點不太「合適」。spring
寫法怎麼來肯定,每一個人不一樣,只要你的選擇在項目裏始終如一就行。對於我來講,我選擇將Model做爲請求處理方法的參數,不只是由於這種寫法更新一點,簡便一點,更由於它能夠獲取更多信息。咱們知道Model是伴隨一個請求的整個過程的,在請求處理方法執行以前,Model有可能已經有數據了,把Model做爲參數,就能夠看到方法執行以前的數據了。接下來,咱們看看,在方法執行以前如何給Model裏添加數據。mvc
在全部的請求處理方法執行以前,你有機會往Model裏面加數據:新建一個方法,加上@ModelAttribute註解和Model參數,就能夠像下圖這種樣加數據了。app
注意,每一個請求處理方法在執行以前,都會執行一次fillData方法。雖然fillData不是@RequestMapping方法,不能指定請求路徑,可是能夠添加不少請求處理方法的參數,好比@RequestParam,@RequestHeader等。好比你的HTTP請求裏有一個Header是自定義的,那麼你能夠在fillData方法裏,獲取到Header的信息,再根據它獲取一些數據好比用戶信息什麼的,放到Model裏。框架
若是fillData裏的數據不多,只有一個對象,你能夠直接把這個對象返回,它會自動被加入到Model裏,至關於隱性執行了Model的addAttribute(Object)
方法。下圖中你能夠看到,雖然你沒有指明在Model中User對象的名字,可是Model自動給它了一個名字「user」,由於你不提供名字(即key)的話,框架會根據類名生成一個,規則是類名首字母小寫(User->user)。這個key若是你想改,就給fillData方法的@ModelAttribute註解添加一個參數。spring-boot
@ModelAttribute還有一種用途是做爲請求處理方法的參數,若是你須要Model中某個對象,能夠給參數添加@ModelAttribute註解:ui
若是Model中沒有User對象,那麼框架會建立一個,並放到Model中,也就是說user變量確定不爲空。而後呢,GET請求或者POST請求的參數,會跟user對象的成員(fields)名稱進行對應,對的上的話就賦值給成員。這個過程也叫作數據綁定(Data Binding),一個典型的應用就是處理表單。由於這種用法太常見了,因此@ModelAttribute也是能夠省略的,請求處理方法的參數,若是不是框架能識別的類型,都會假定它用了@ModelAttribute。3d
文本不打算對數據綁定這一起進行說明,由於東西還挺多的,以後介紹表單處理的時候咱們再詳細解讀。