SpringMVC中Map、Model、ModelMap、ModelAndView之間的關系及區別


  首先,在了解這三者之前,需要知道一點: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 可以在儲存數據的同時,可以進行設置返回的邏輯視圖,進行控制展示層的跳轉。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM