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