1. 程式人生 > >Model、ModelMap和ModelAndView的使用詳解

Model、ModelMap和ModelAndView的使用詳解

1.前言

最近SSM框架開發web專案,用得比較火熱。spring-MVC肯定用過,在請求處理方法可出現和返回的引數型別中,最重要就是Model和ModelAndView了,對於MVC框架,控制器Controller執行業務邏輯,用於產生模型資料Model,而檢視View用於渲染模型資料。 
使用Model和ModelAndView這兩個類在spring的檢視解析時作用以及區別。 
這兩者之間有著很大的區別,具體就表現在Model只是用來傳輸資料的,並不會進行業務的定址。ModelAndView 卻是可以進行業務定址的,就是設定對應的要請求的靜態檔案,這裡的靜態檔案指的是類似jsp的檔案。 
其次,兩者還有一個最大的區別,那就是Model是每一次請求可以自動建立,但是ModelAndView 是需要我們自己去new的。

2.model方法

注意:如果在控制層上的方法聲明瞭註解@ResponseBody ,則會直接將返回值輸出到頁面。 
Model 是一個介面, 其實現類為ExtendedModelMap,繼承了ModelMap類。

public class ExtendedModelMap extends ModelMap implements Model

一般來說,可以用model來接收各種型別的資料,如果使用來接收一組資料List 》》那麼這個時候的model實際上是ModelMap。

3.ModelMap方法

ModelMap物件主要用於傳遞控制方法處理資料到結果頁面,也就是說我們把結果頁面上需要的資料放到ModelMap物件中即可, 
他的作用類似於request物件的setAttribute方法

的作用: 用來在一個請求過程中傳遞處理的資料。 
ModelMap或者Model通過addAttribute方法向頁面傳遞引數. 

ModelMap物件的 addAttribute,put兩個方法區別是:       addAttribute是不允許新增空值的key,put是允許的

其中addAttribute方法引數有多種方式: 
常用的有:寫在java程式碼中

public ModelMap addAttribute(String attributeName, Object attributeValue){...}
public ModelMap addAttribute(Object attributeValue){...}
public ModelMap addAllAttributes(Collection<?> attributeValues) {...}
public ModelMap addAllAttributes(Map<String, ?> attributes){...}

然後在jsp頁面上可以通過el表示式語言$attributeName或者是C標籤庫下的方法,來獲取並展示modelmap中的資料。 
modelmap本身不能設定頁面跳轉的url地址別名或者物理跳轉地址. 
那麼我們可以通過控制器方法的字串返回值來設定跳轉url地址別名或者物理跳轉地址。

4.ModelAndView方法

新增模型資料用addObject; 
設定檢視setViewName; 
ModelAndView 物件有兩個作用: 
(1). 設定轉向地址,這也是ModelAndView和ModelMap的主要區別.設定方式如下所示:

ModelAndView view = new ModelAndView("path:student");

或者通過setViewName方式:

public void setViewName(String viewName){...}

(2). 將控制器方法中處理的結果資料傳遞到結果頁面,也就是把在結果頁面上需要的資料放到ModelAndView物件中即可,其作用類似於request物件的setAttribute方法的作用,用來在一個請求過程中傳遞處理的資料。通過以下方法向頁面傳遞引數:

public ModelAndView addObject(String attributeName, Object attributeValue){...}
public ModelAndView addObject(Object attributeValue){...}

在jsp中:也是可以通過el表示式語言attributeName或者C標籤庫的attributeName或者C標籤庫的{name } 來獲取並展示ModelAndView中的資料。

5.使用示例

(1) Model 或者 ModelMap 
Model 和 ModelMap 的例項都是spirng mvc框架來自動建立並作為控制器方法引數傳入,使用者無需自己建立。 
而且需要return 返回指定的頁面路徑.

在控制層的java程式碼中寫入:

    //傳值方法一
    @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>

圖示: 
java: 
這裡寫圖片描述
jsp: 
這裡寫圖片描述

效果: 
這裡寫圖片描述

資料列表全部獲取到!

(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>

圖示: 
這裡寫圖片描述

jsp: 
這裡寫圖片描述

效果: 
這裡寫圖片描述

資料列表全部獲取到!

以上就是兩種不同的方式取值傳值,從上面我們可以看得出來這兩個之間還是有一定的區別的,記住有一個需要返回物件,一個需要返回的是地址路徑。

You got a dream, you gotta protect it. 
如果你有夢想的話,就要去捍衛它 。 ——《當幸福來敲門》

相關推薦

ModelModelMapModelAndView的使用 ModelModelMapModelAndView的使用

原 Model、ModelMap和ModelAndView的使用詳解 置頂 2018年03月25日 12:40:00 zout鄒濤 閱讀數:1

ModelModelMapModelAndView的使用

1.前言 最近SSM框架開發web專案,用得比較火熱。spring-MVC肯定用過,在請求處理方法可出現和返回的引數型別中,最重要就是Model和ModelAndView了,對於MVC框架,控制器Controller執行業務邏輯,用於產生模型資料Model,而檢視V

ModelModelMapModelAndView的用法總結

三者的區別 Model Model是一個介面,它的實現類ExtendModelMap繼承自ModelMap類 public class ExtendModelMap extends ModelMap implements Model ModelMap Mo

Redis系列--7RedisTemplate Serializer

redistemplate serializer詳解<bean id="redisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate"> <property name="connectionF

MySQL中tinytexttextmediumtextlongtext

空值 bin fcc val name 分辨 單選 objects 1.7 一、數字類型 類型 範圍 說明 Char(N) [ binary] N=1~255 個字元binary :分辨大小寫 固定長度 std_name cahr(32) not

touch事件中的touchestargetToucheschangedTouches

move htm nal 手指 tde hang 參數 eve function touches:當前屏幕上所有觸摸點的列表; targetTouches:當前對象上所有觸摸點的列表; changedTouches:涉及當前(引發)事件的觸摸點的列表: 可通過一個例子來區分

UARTSPII2C

運算 引入 下拉 初始 故障 服務 布線 發的 理由 做單片機開發時UART,SPI和I2C都是我們最經常使用到的硬件接口,我收集了相關的具體材料對這三種接口進行了詳細的解釋。 UART UART是一種通用串行數據總線,用於異步通信。該總線雙向通信,可以實現全雙工傳輸和接收

Android 自定義view(1) --- AttrStyleTheme

轉載:https://www.jianshu.com/p/dd79220b47dd 概念說明:       Attr:屬性,風格樣式的最小單元;      Style:風格,它是一系列Attr的集合用以定義一個View

本地儲存(一)—— CookieSessionStorageLocalStorage

目錄 1. Cookie 2. Web Storage 2.1 Session Storage 2.2 Local Storage 2.3 Web Storage 的瀏覽器支援情況 3. Cookie、SessionStorage和LocalStorage的對比

StringStringBuilderStringBuffer

以JDK1.8原始碼為例 一、原始碼 String: public final class String implements java.io.Serializable, Comparable<String>, CharSequence { …… }

TCPUDPHTTP

http:是用於www瀏覽的一個協議。 tcp:是機器之間建立連線用的到的一個協議。 1、TCP/IP是個協議組,可分為三個層次:網路層、傳輸層和應用層。 在網路層有IP協議、ICMP協議、ARP協議、RARP協議和BOOTP協議。 在傳輸層中有TCP協議與UDP協議。 在

Opencv RotatedRect類中的pointsanglewidthheight

在Opencv中的影象處理中,經常要用到minAreaRect()函式求最小外接矩形, 該函式的返回值就是一個RotatedRect類物件。 RotatedRect類定義如下: class CV_EXPORTS RotatedRect { public: //! various

javascript中的_proto_constructorprototype

首先,在JavaScript中,任何物件都有一個proto屬性;任何方法都有prototype屬性,指向一個物件,稱為原型物件,這個物件有一個proto屬性,另外還有一個constructor屬性。 <script> function

IOS基礎UI之(五)UIAlertViewUIActionSheetUIAlertController

     iOS 8的新特性之一就是讓介面更有適應性、更靈活,因此許多檢視控制器的實現方式發生了巨大的變化。比如說Alert Views、Action Sheets。 下面就大致介紹它們的使用方式。     UIAlertView:   1.建立UIAlertView

javascript技術難點(三)之thisnewapplycall

4)    this、new、call和apply的相關問題   講解this指標的原理是個很複雜的問題,如果我們從javascript裡this的實現機制來說明this,很多朋友可能會越來越糊塗,因此本篇打算換一個思路從應用的角度來講解this指標,從這個角度理解this

【扯皮系列】一篇與眾不同的 StringStringBuilder StringBuffer

## 碎碎念 這是一道老生常談的問題了,字串是不僅是 Java 中非常重要的一個物件,它在其他語言中也存在。比如 **C++、Visual Basic、C# 等**。字串使用 String 來表示,字串一旦被創建出來就不會被修改,當你想修改 StringBuffer 或者是 StringBuilder,出於

R數據可視化----ggplot2之標度坐標軸圖例

abs 調整 所有 不同的 size n) 默認 表達 idt 標度控制著數據到圖形屬性的映射,當有需要時,ggplot2會自動添加一個默認的標度。我們確實可以在不了解標度運行原理的情況下畫出許多圖形,但理解標度並學會如何操縱它們則將賦予我們對圖形更強的控制能力。 每一種圖

spring框架中ModelAndViewModelModelMap區別

實現類 java類 lan esp 測試 public googl user ram 轉載來源:http://www.cnblogs.com/google4y/p/3421017.html 註意:如果方法聲明了註解@ResponseBody ,則會直接將返回值輸出到頁面

23C#:窗口的屬性事件

c#在C#語言編程中,每一個圖形組件都有自己的屬性、方法和事件。就像易語言一樣。我們學習易語言,用的是中文,一看便知。但是,C#語言的屬性、方法和事件都是英文的。許多時候,就是因為不知道英文單詞的意思,我們就只好放棄了學習。這裏,我就把C#裏面窗口的屬性和事件的英文做個翻譯後的詳細解釋。屬性是分類的,我先寫分

SQL中INNERLEFTRIGHT JOIN的區別用法

相信很多人在剛開始使用資料庫的INNER JOIN、LEFT JOIN和RIGHT JOIN時,都不太能明確區分和正確使用這三種JOIN操作,本文通過一個簡單的例子通俗易懂的講解這三者的區別,希望對大家能帶來幫助。 首先,我們建立示例資料庫和表。同時也要明確一個概念:A INN