首先,在了解這三者之前,需要知道一點:SpringMVC在調用方法前會創建一個隱含的數據模型(Model),作為模型數據的存儲容器, 成為”隱含模型”。
如果controller方法的參數為Moedl或ModelMap類型,則spring MVC會將隱含模型的引用傳遞給這些參數。在處理方法內部,開發者就可以通過這個參數對象訪問模型中的所有數據,也可以向模型中添加新的屬性數據。也就是說在每一次的前后台請求的時候會隨帶這一個背包(Model),不管你有沒有用,這個背包確實是存在的,用來盛放我們請求交互傳遞的值。
在前端向后台請求時,Model 和 ModelMap 的實例都是spirng mvc框架來自動創建的,用戶無需自己創建。
無論是Mode還是ModelMap底層都是使用BindingAwareModelMap,所以兩者基本沒什么區別,我們只需拿來使用即可。而ModelAndView則需要我們手動進行new,springMVC不會幫我們創建。
既然這四個類或接口被放在一起對比,那么它們之間肯定有相同點:
1.它們的作用相同,都是用於傳遞控制方法存儲數據到展示頁面(JSP頁面),通過EL表達式或者C標簽庫的{name } 來獲取對對象的key進行取值。
它們之間的區別:
1.Map、Model、ModelMap不需要我們手動創建,springmvc框架自動創建並作為控制器方法參數傳入;而ModelAndView需要手動創建。
2.Model只是用來傳輸數據的,並不會進行業務的尋址。ModelAndView卻是可以進行業務尋址的,就是設置對應的要請求的靜態文件,這里的靜態文件指的是類似jsp的文件。
示例1:Model 和 ModelMap
Model 和 ModelMap 的實例都是spirng mvc框架來自動創建並作為控制器方法參數傳入,用戶無需自己創建。
而且需要return 返回指定的頁面路徑。
控制層代碼:
//傳值方法一 @RequestMapping("listCategory2") public String listCategory2(Model model) { // 接收查詢的信息 List<Category> cs2= categoryService.list(); // 封裝了查詢的數據 model.addAttribute("test", cs2); //重要!!需要給出返回model跳轉的路徑 return "listCategory2"; }
JSP頁面:
<!-- 獲取值的時候,對應的是addAttribute的第一個參數!取了個別名為c--> <c:forEach items="${test }" var="c" varStatus="st"> <tr> <td>${c.id}</td> <td>${c.name}</td> </tr> </c:forEach>
示例2:ModelAndView
ModelAndView的實例是需要我們手動new的,這也是和ModelMap的一個區別。
而且,ModelAndView 可以自己尋址,只需要return 返回其對象即可。
java代碼:
//傳值方法二:使用ModelAndView //當url處於這個時,由listCategory方法來處理請求 @RequestMapping("listCategory") public ModelAndView listCategory(){ //創建一個模型視圖對象 ModelAndView mav = new ModelAndView(); //獲取到查詢的數據 List<Category> cs= categoryService.list(); // //將數據放置到ModelAndView對象view中,第二個參數可以是任何java類型 mav.addObject("cs", cs); // 放入jsp路徑 mav.setViewName("listCategory"); //返回ModelAndView對象mav return mav; }
JSP代碼:
<!-- 使用c標簽庫,循環遍歷出數據 ,命名為c--> <c:forEach items="${cs}" var="c" varStatus="st"> <tr> <td>${c.id}</td> <td>${c.name}</td> </tr> </c:forEach>
以上就是兩種不同的方式取值傳值,從上面我們可以看得出來這兩個之間還是有一定的區別的,記住有一個需要返回對象,一個需要返回的是地址路徑。
簡單總結:
Map 為原生的儲存鍵值的對象,自然的里面一大堆的方法可以使用。
Model 只有寥寥幾個方法只適合用於儲存數據,簡化了新手對於Model對象的操作和理解;
ModelMap 繼承了 LinkedMap ,除了實現了自身的一些方法,同樣的繼承 LinkedMap 的方法和特性;
Map、Model、ModelMap之間本質無太大區別。
ModelAndView 可以在儲存數據的同時,可以進行設置返回的邏輯視圖,進行控制展示層的跳轉。
