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

Model、ModelMap和ModelAndView的使用詳解 Model、ModelMap和ModelAndView的使用詳解

Model、ModelMap和ModelAndView的使用詳解

置頂 2018年03月25日 12:40:00 閱讀數:11617
																														</div>
			<div class="operating">
													</div>
		</div>
	</div>
</div>
<article class="baidu_pl">
	<div id="article_content" class="article_content clearfix csdn-tracking-statistics" data-pid="blog" data-mod="popu_307" data-dsm="post">
							<div class="article-copyright">
				版權宣告:本文為博主柒曉白(鄒濤)原創文章,未經博主允許不得轉載,否則追究法律責任。					https://blog.csdn.net/ITBigGod/article/details/79685610				</div>
							            <div id="content_views" class="markdown_views">
						<!-- flowchart 箭頭圖示 勿刪 -->
						<svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path></svg>
						<h2 id="1前言"><a name="t0"></a>1.前言</h2>

最近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
  
  • 1

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

3.ModelMap方法

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

的作用: 用來在一個請求過程中傳遞處理的資料
ModelMap或者Model通過addAttribute方法向頁面傳遞引數.
其中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){...}
  
  • 1
  • 2
  • 3
  • 4

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

4.ModelAndView方法

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

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

或者通過setViewName方式:

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

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

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

在jsp中:也是可以通過el表示式語言attributeNameCattributeName或者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";
    }
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

然後在jsp頁面中寫入:

<!-- 獲取值的時候,對應的是addAttribute的第一個引數!取了個別名為c-->
    <c:forEach items="${test }" var="c" varStatus="st">
        <tr>
            <td>${c.id}</td>
            <td>${c.name}</td>
        </tr>
    </c:forEach>
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

圖示:
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;
    }
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

在jsp頁面中:

 <!-- 使用c標籤庫,迴圈遍歷出資料 ,命名為c-->
    <c:forEach items="${cs}" var="c" varStatus="st">
        <tr>
            <td>${c.id}</td>
            <td>${c.name}</td>
        </tr>
    </c:forEach>
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

圖示:
這裡寫圖片描述

jsp:
這裡寫圖片描述

效果:
這裡寫圖片描述

資料列表全部獲取到!

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


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

				<script>
					(function(){
						function setArticleH(btnReadmore,posi){
							var winH = $(window).height();
							var articleBox = $("div.article_content");
							var artH = articleBox.height();
							if(artH > winH*posi){
								articleBox.css({
									'height':winH*posi+'px',
									'overflow':'hidden'
								})
								btnReadmore.click(function(){
									articleBox.removeAttr("style");
									$(this).parent().remove();
								})
							}else{
								btnReadmore.parent().remove();
							}
						}
						var btnReadmore = $("#btn-readmore");
						if(btnReadmore.length>0){
							if(currentUserName){
								setArticleH(btnReadmore,3);
							}else{
								setArticleH(btnReadmore,1.2);
							}
						}
					})()
				</script>
				</article>