Model、ModelMap和ModelAndView的使用详解
1.前言
最近SSM框架開發(fā)web項(xiàng)目,用得比較火熱。spring-MVC肯定用過,在請(qǐng)求處理方法可出現(xiàn)和返回的參數(shù)類型中,最重要就是Model和ModelAndView了,對(duì)于MVC框架,控制器Controller執(zhí)行業(yè)務(wù)邏輯,用于產(chǎn)生模型數(shù)據(jù)Model,而視圖View用于渲染模型數(shù)據(jù)。
使用Model和ModelAndView這兩個(gè)類在spring的視圖解析時(shí)作用以及區(qū)別。
這兩者之間有著很大的區(qū)別,具體就表現(xiàn)在Model只是用來傳輸數(shù)據(jù)的,并不會(huì)進(jìn)行業(yè)務(wù)的尋址。ModelAndView 卻是可以進(jìn)行業(yè)務(wù)尋址的,就是設(shè)置對(duì)應(yīng)的要請(qǐng)求的靜態(tài)文件,這里的靜態(tài)文件指的是類似jsp的文件。
其次,兩者還有一個(gè)最大的區(qū)別,那就是Model是每一次請(qǐng)求可以自動(dòng)創(chuàng)建,但是ModelAndView 是需要我們自己去new的。
2.model方法
注意:如果在控制層上的方法聲明了注解@ResponseBody ,則會(huì)直接將返回值輸出到頁面。
Model 是一個(gè)接口, 其實(shí)現(xiàn)類為ExtendedModelMap,繼承了ModelMap類。
一般來說,可以用model來接收各種類型的數(shù)據(jù),如果使用來接收一組數(shù)據(jù)List 》》那么這個(gè)時(shí)候的model實(shí)際上是ModelMap。
3.ModelMap方法
ModelMap對(duì)象主要用于傳遞控制方法處理數(shù)據(jù)到結(jié)果頁面,也就是說我們把結(jié)果頁面上需要的數(shù)據(jù)放到ModelMap對(duì)象中即可,
他的作用類似于request對(duì)象的setAttribute方法的作用: 用來在一個(gè)請(qǐng)求過程中傳遞處理的數(shù)據(jù)。
ModelMap或者M(jìn)odel通過addAttribute方法向頁面?zhèn)鬟f參數(shù).
其中addAttribute方法參數(shù)有多種方式:
常用的有:寫在java代碼中
然后在jsp頁面上可以通過el表達(dá)式語言$attributeName或者是C標(biāo)簽庫下的方法,來獲取并展示modelmap中的數(shù)據(jù)。
modelmap本身不能設(shè)置頁面跳轉(zhuǎn)的url地址別名或者物理跳轉(zhuǎn)地址.
那么我們可以通過控制器方法的字符串返回值來設(shè)置跳轉(zhuǎn)url地址別名或者物理跳轉(zhuǎn)地址。
4.ModelAndView方法
添加模型數(shù)據(jù)用addObject;
設(shè)置視圖setViewName;
ModelAndView 對(duì)象有兩個(gè)作用:
(1). 設(shè)置轉(zhuǎn)向地址,這也是ModelAndView和ModelMap的主要區(qū)別.設(shè)置方式如下所示:
或者通過setViewName方式:
public void setViewName(String viewName){...}(2). 將控制器方法中處理的結(jié)果數(shù)據(jù)傳遞到結(jié)果頁面,也就是把在結(jié)果頁面上需要的數(shù)據(jù)放到ModelAndView對(duì)象中即可,其作用類似于request對(duì)象的setAttribute方法的作用,用來在一個(gè)請(qǐng)求過程中傳遞處理的數(shù)據(jù)。通過以下方法向頁面?zhèn)鬟f參數(shù):
public ModelAndView addObject(String attributeName, Object attributeValue){...} public ModelAndView addObject(Object attributeValue){...}在jsp中:也是可以通過el表達(dá)式語言attributeName或者C標(biāo)簽庫的attributeName或者C標(biāo)簽庫的{name } 來獲取并展示ModelAndView中的數(shù)據(jù)。
5.使用示例
(1) Model 或者 ModelMap
Model 和 ModelMap 的實(shí)例都是spirng mvc框架來自動(dòng)創(chuàng)建并作為控制器方法參數(shù)傳入,用戶無需自己創(chuàng)建。
而且需要return 返回指定的頁面路徑.
在控制層的java代碼中寫入:
//傳值方法一@RequestMapping("listCategory2")public String listCategory2(Model model) {// 接收查詢的信息List<Category> cs2= categoryService.list();// 封裝了查詢的數(shù)據(jù)model.addAttribute("test", cs2);//重要!!需要給出返回model跳轉(zhuǎn)的路徑return "listCategory2";}然后在jsp頁面中寫入:
<!-- 獲取值的時(shí)候,對(duì)應(yīng)的是addAttribute的第一個(gè)參數(shù)!取了個(gè)別名為c--><c:forEach items="${test }" var="c" varStatus="st"><tr><td>${c.id}</td><td>${c.name}</td></tr></c:forEach>圖示:
java:
jsp:
效果:
數(shù)據(jù)列表全部獲取到!
(2) ModelAndView
ModelAndView的實(shí)例是需要我們手動(dòng)new的,這也是和ModelMap的一個(gè)區(qū)別。
而且,ModelAndView 可以自己尋址,只需要return 返回其對(duì)象即可。
在控制層的java代碼中寫入:
//傳值方法二:使用ModelAndView//當(dāng)url處于這個(gè)時(shí),由listCategory方法來處理請(qǐng)求@RequestMapping("listCategory")public ModelAndView listCategory(){//創(chuàng)建一個(gè)模型視圖對(duì)象ModelAndView mav = new ModelAndView();//獲取到查詢的數(shù)據(jù)List<Category> cs= categoryService.list();// //將數(shù)據(jù)放置到ModelAndView對(duì)象view中,第二個(gè)參數(shù)可以是任何java類型mav.addObject("cs", cs);// 放入jsp路徑mav.setViewName("listCategory");//返回ModelAndView對(duì)象mavreturn mav;}在jsp頁面中:
<!-- 使用c標(biāo)簽庫,循環(huán)遍歷出數(shù)據(jù) ,命名為c--><c:forEach items="${cs}" var="c" varStatus="st"><tr><td>${c.id}</td><td>${c.name}</td></tr></c:forEach>圖示:
jsp:
圖示:
jsp:
效果:
數(shù)據(jù)列表全部獲取到!
以上就是兩種不同的方式取值傳值,從上面我們可以看得出來這兩個(gè)之間還是有一定的區(qū)別的,記住有一個(gè)需要返回對(duì)象,一個(gè)需要返回的是地址路徑。
總結(jié)
以上是生活随笔為你收集整理的Model、ModelMap和ModelAndView的使用详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 代码整洁之道 python_代码整洁之道
- 下一篇: JVM垃圾回收机制学习