SpringMVC裡的Model、Map、ModelMap以及ModelAndView

hugh Lee發表於2017-07-23

首先理解,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

相關文章