江蘇省建設(shè)廳網(wǎng)站模板建站網(wǎng)頁(yè)
SpringMVC中Model和ModelAndView的區(qū)別
兩者的區(qū)別:
在SpringMVC中,Model和ModelAndView都是用于將數(shù)據(jù)傳遞到視圖層的對(duì)象
Model是”模型“的意思,是MVC架構(gòu)中的”M“部分,是用來(lái)傳輸數(shù)據(jù)的。
理解成MVC架構(gòu)中的”M“和”V“,其中包含”Model“和”View“兩部分,主要功能是:設(shè)置轉(zhuǎn)向地址,將底層獲取的數(shù)據(jù)進(jìn)行存儲(chǔ)(或者封裝),最后將數(shù)據(jù)傳遞給View。
Model只是用來(lái)傳輸數(shù)據(jù)的,并不會(huì)進(jìn)行業(yè)務(wù)的尋址。ModelAndView 卻是可以進(jìn)行業(yè)務(wù)尋址的,就是設(shè)置對(duì)應(yīng)的要請(qǐng)求的靜態(tài)文件,這里的靜態(tài)文件指的是類似JSP的文件。
Model是每次請(qǐng)求中都存在的默認(rèn)參數(shù),利用其addAttribute()方法即可將服務(wù)器的值傳遞到JSP頁(yè)面中。
ModelAndView包含Model和View兩部分,使用時(shí)需要自己實(shí)例化,利用ModelMap用來(lái)傳值,也可以設(shè)置View的名稱。
其次,兩者還有一個(gè)最大的區(qū)別,每次發(fā)起請(qǐng)求后Spring MVC會(huì)自動(dòng)創(chuàng)建Model對(duì)象,而ModelAndView需要我們自己創(chuàng)建
總結(jié):
雖然Model和ModelAndView都可以用于將數(shù)據(jù)傳遞到視圖層,但ModelAndView更加強(qiáng)大,因?yàn)樗粌H可以傳遞數(shù)據(jù),還可以指定要呈現(xiàn)的視圖。如果你只需要傳遞數(shù)據(jù)而不關(guān)心視圖,則可以使用Model。但如果你需要同時(shí)傳遞數(shù)據(jù)和指定視圖,則應(yīng)該使用ModelAndView。
Model在Controller層的寫法
@Controller //代表這個(gè)類會(huì)被Spring接管,被這個(gè)注解的類中所有方法,如果返回值是String,并且有具體的頁(yè)面可以跳轉(zhuǎn),那么就會(huì)被視圖解析器解析
public class IndexController {@RequestMapping("/demo") //意為請(qǐng)求 localhost:8080/demopublic String demo(Model model){//封裝數(shù)據(jù)(向模型中添加數(shù)據(jù),可以jsp頁(yè)面直接取出并渲染)model.addAttribute("Content","Hello");//會(huì)被視圖解析器處理return "Hello"; //返回到哪個(gè)頁(yè)面 }
}
model方法是可以返回一個(gè)對(duì)象的。model.addAttribute(String s,Object o),返回對(duì)象要?jiǎng)?chuàng)建一個(gè)實(shí)體對(duì)象生成getter和Setter,還有同String()方法
ModelAndView在Controller層的寫法
@Controller
@RequestMapping
public class IndexController {@RequestMapping("/demo2")public ModelAndView demo2(){ModelAndView modelAndView = new ModelAndView();//返回到那個(gè)前端文件modelAndView.setViewName("hello"); modelAndView.addObject("ContentOne","HelloOne");modelAndView.addObject("ContentTwo","HelloTwo");System.out.println(modelAndView);return modelAndView;}
}