- 資訊首頁(yè) > 開(kāi)發(fā)技術(shù) > 編程語(yǔ)言 >
- SpringMVC處理數據輸出的實(shí)例代碼
控制器處理方法的返回值如果為ModelAndView, 則其既包含視圖信息,也包含模型數據信息。數據是放在請求域中的。
//使用ModelAndView @RequestMapping("/output3") public ModelAndView output3(){ ModelAndView modelAndView = new ModelAndView("success"); //viewName即為跳轉頁(yè)面 modelAndView.addObject("msg","ModelAndView處理數據"); return modelAndView; }
可以在方法的參數列表傳入Map或者M(jìn)odel或者M(jìn)odelMap,這些參數里面保存的所有數據都會(huì )放在request請求域中,可以在頁(yè)面中獲取這些數據。
@Controller public class OutputController { //使用Map @RequestMapping("/output") public String output(Map<String, Object> map){ map.put("msg","輸出數據處理"); return "success"; } //使用Model,一個(gè)接口 @RequestMapping("/output1") public String output1(Model model){ model.addAttribute("msg","model處理數據"); return "success"; } //使用ModelMap @RequestMapping("/output2") public String output2(ModelMap modelMap){ modelMap.addAttribute("msg","modelMap處理數據"); return "success"; } }
實(shí)際上Map、Model、ModelMap最終實(shí)現都是BindingAwareModelMap,相當于BindingAwareModelMap中保存的數據都會(huì )被放在請求域中。
Map是JDK中的一個(gè)interface,Model是Spring中的一個(gè)interface,而ModelMap是Spring中的一個(gè)Class
ModelMap源碼中實(shí)際上是繼承LinkedHashMap類(lèi),所以本質(zhì)上屬于Map接口的一個(gè)實(shí)現類(lèi)
public class ModelMap extends LinkedHashMap<String, Object>
BindingAwareModelMap源碼中繼承ExtendedModelMap類(lèi),而ExtendedModelMap這個(gè)類(lèi)又繼承于ModelMap類(lèi),同時(shí)實(shí)現Model接口。
public class BindingAwareModelMap extends ExtendedModelMap public class ExtendedModelMap extends ModelMap implements Model
所以Map、Model、ModelMap三者關(guān)系如下:
SpringMVC提供了一種可以臨時(shí)給Session域中保存數據的方式,即使用@SessionAttributes注解,這個(gè)注解只能作用在類(lèi)上。
//給BindingAwareModelMap中保存的數據,同時(shí)在session中也保存一份,value指定保存數據時(shí)要給session中放的數據的key //type只要是指定的類(lèi)型的數據,session就會(huì )保存 @SessionAttributes(value = "msg",types = {String.class}) @Controller public class OutputController
某些業(yè)務(wù)場(chǎng)景不需要全字段更新,比如修改book對象信息,bookName只讀而不能修改,只有其中某寫(xiě)字段的值可以修改。如果讓SpringMVC去new一個(gè)對象,某些字段會(huì )有默認值,將new出來(lái)的對象去更新數據庫的值,很有可能會(huì )發(fā)生null值覆蓋了原來(lái)不能修改的字段的值。
所以,SpringMVC要封裝請求參數的Book對象不應該是自己new出來(lái)的,而應該是從數據庫中取出來(lái)的對象,使用這個(gè)對象來(lái)封裝請求參數,這樣只是修改了指定的字段值,沒(méi)有修改的字段值保持原來(lái)的值。
@ModelAttribute注解可以加載參數上,也可以加在方法上,如果加在方法上,這個(gè)方法就會(huì )提前于目標方法運行。也就可以實(shí)現提前在數據庫查詢(xún)信息,并保存。在參數上加上注解就可以獲取到這個(gè)從數據庫中取出的對象,而不是去new一個(gè)對象出來(lái)。
@Controller public class ModelAttributeTestController { private Object o1; private Object o2; @RequestMapping("/updateBook") public String updateBook(@ModelAttribute Book book, ModelMap modelMap){ o2 = modelMap; System.out.println(o1 == o2); //true //參數使用注解,就不會(huì )new一個(gè)對象,而是使用從數據庫中取出的對象 return "success"; } @ModelAttribute public void modelAttr(Map<String, Object> map){ o1 = map; //此方法從數據庫中取得數據,并提前于目標方法執行 } }
兩個(gè)方法中的map以及book對象實(shí)際上都是同一個(gè)BindingAwareModelMap,實(shí)現的數據的互通。
到此這篇關(guān)于SpringMVC處理數據輸出的文章就介紹到這了,更多相關(guān)SpringMVC處理數據輸出內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。
Copyright ? 2009-2022 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 特網(wǎng)科技 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 百度云 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站