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方法向頁面傳遞參數.
其中addAttribute方法參數有多種方式:
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標簽庫的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>
(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>