SpringMVC裏的Model、Map、ModelMap以及ModelAndView

首先理解,model從哪裏來?

SpringMVC內部使用一個org.springframework.ui.Model接口存儲的數據模型,它的功能類似於Java.uitl.Map,但是比Map更好用 org.springframework.ui.ModelMap實現Map接口。

SpringMVC在調用方法前會創建一個隱含的數據模型,作爲模型數據的存儲容器, 成爲”隱含模型”。

如果處理方法入參爲Map或者Model類型,SpringMVC會將隱含模型的引用傳遞給這些入參。

這裏寫圖片描述

spring Web MVC 提供Model、Map或ModelMap讓我們能去暴露渲染視圖需要的模型數據。

@RequestMapping(value = "/model")
public String createUser(Model model, Map model2, ModelMap model3) {
    model.addAttribute("a", "a");
    model2.put("b", "b");
    model3.put("c", "c");
    System.out.println(model == model2);
    System.out.println(model2 == model3);
    return "success";}

雖然此處注入的是三個不同的類型(Model model, Map model2, ModelMap model3),但三者是同一個對象。

AnnotationMethodHandlerAdapter和RequestMappingHandlerAdapter將使用BindingAwareModelMap作爲模型對象的實現,即此處我們的形參(Model model, Map model2, ModelMap model3)都是同一個BindingAwareModelMap實例。

另外關於Model和ModelAndView

@RequestMapping(value = "/mergeModel")
public ModelAndView mergeModel(Model model) {
    model.addAttribute("a", "a");//①添加模型數據
    ModelAndView mv = new ModelAndView("success");
    mv.addObject("a", "update");//②在視圖渲染之前更新③處同名模型數據
    model.addAttribute("a", "new");//③修改①處同名模型數據
    //視圖頁面的a將顯示爲"update" 而不是"new"
    return mv;
}

從代碼中我們可以總結出功能處理方法的返回值中的模型數據(如ModelAndView)會 合併 功能處理方法形式參數中的模型數據(如Model),但如果兩者之間有同名的,返回值中的模型數據會覆蓋形式參數中的模型數據。

在處理方法的方法體中,可以使用如下方法添加數據模型:

[ModelAndView] 
addObject(String attributeName,Object attributeValue);
addAllObject(Map<String,?> modelMap);

[Model]
model.addAttribute("person", person)

[Map]
put(String attributeName,Object attributeValue);

Tips:

放到Map中的數據如何傳值到前臺,以及前臺如何取值?

ModelMap對象主要用於傳遞控制方法處理數據到結果頁面,也就是說我們把結果頁面上需要的數據放到ModelMap對象中即可,他的作用類似於request對象的setAttribute方法的作用,用來在一個請求過程中傳遞處理的數據。

① 通過以下方法向頁面傳遞參數:
addAttribute(String key,Object value);

② JSP頁面取值:
${requestScope.key} 。

轉自:http://blog.csdn.net/J080624/article/details/52817498?locationNum=2&fps=1

發佈了73 篇原創文章 · 獲贊 192 · 訪問量 78萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章