Model、ModelMap和ModelAndView的使用詳解

1.前言
最近SSM框架開發web項目,用得比較火熱。spring-MVC確定用過,在請求處理方法可出現和返回的參數類型中,最重要就是Model和ModelAndView了,對於MVC框架,控制器Controller執行業務邏輯,用於產生模型數據Model,而視圖View用於渲染模型數據。
使用Model和ModelAndView這兩個類在spring的視圖解析時做用以及區別。
這二者之間有着很大的區別,具體就表如今Model只是用來傳輸數據的,並不會進行業務的尋址。ModelAndView 倒是能夠進行業務尋址的,就是設置對應的要請求的靜態文件,這裏的靜態文件指的是相似jsp的文件。
其次,二者還有一個最大的區別,那就是Model是每一次請求能夠自動建立,可是ModelAndView 是須要咱們本身去new的。java

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

public class ExtendedModelMap extends ModelMap implements Model
1
通常來講,能夠用model來接收各類類型的數據,若是使用來接收一組數據List 》》那麼這個時候的model其實是ModelMap。spring

3.ModelMap方法
ModelMap對象主要用於傳遞控制方法處理數據到結果頁面,也就是說咱們把結果頁面上須要的數據放到ModelMap對象中便可,
他的做用相似於request對象的setAttribute方法的做用: 用來在一個請求過程當中傳遞處理的數據。
ModelMap或者Model經過addAttribute方法向頁面傳遞參數.
其中addAttribute方法參數有多種方式:
經常使用的有:寫在java代碼中mvc

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地址別名或者物理跳轉地址。app

4.ModelAndView方法
添加模型數據用addObject;
設置視圖setViewName;
ModelAndView 對象有兩個做用:
(1). 設置轉向地址,這也是ModelAndView和ModelMap的主要區別.設置方式以下所示:框架

ModelAndView view = new ModelAndView("path:student");
1
或者經過setViewName方式:jsp

public void setViewName(String viewName){...}
1
(2). 將控制器方法中處理的結果數據傳遞到結果頁面,也就是把在結果頁面上須要的數據放到ModelAndView對象中便可,其做用相似於request對象的setAttribute方法的做用,用來在一個請求過程當中傳遞處理的數據。經過如下方法向頁面傳遞參數:url

public ModelAndView addObject(String attributeName, Object attributeValue){...}
public ModelAndView addObject(Object attributeValue){...}
1
2
在jsp中:也是能夠經過el表達式語言attributeName或者C標籤庫的attributeName或者C標籤庫的{name } 來獲取並展現ModelAndView中的數據。.net

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:


效果:

數據列表所有獲取到!

相關文章
相關標籤/搜索