SpringMVC處理數據輸出的實例代碼

一、 使用ModelAndVIew處理模型數據

控制器處理方法的返回值如果為ModelAndView, 則其既包含視圖信息,也包含模型數據信息。數據是放在請求域中的。

    //使用ModelAndView
    @RequestMapping("/output3")
    public ModelAndView output3(){
        ModelAndView modelAndView = new ModelAndView("success");    //viewName即為跳轉頁面
        modelAndView.addObject("msg","ModelAndView處理數據");
        return modelAndView;
    }

二、使用Map處理模型數據

可以在方法的參數列表傳入Map或者Model或者ModelMap,這些參數裡面保存的所有數據都會放在request請求域中,可以在頁面中獲取這些數據。

@Controller
public class OutputController {

    //使用Map
    @RequestMapping("/output")
    public String output(Map<String, Object> map){
        map.put("msg","輸出數據處理");

        return "success";
    }

    //使用Model,一個接口
    @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";
    }
}

實際上Map、Model、ModelMap最終實現都是BindingAwareModelMap,相當於BindingAwareModelMap中保存的數據都會被放在請求域中。

Map是JDK中的一個interface,Model是Spring中的一個interface,而ModelMap是Spring中的一個Class

ModelMap源碼中實際上是繼承LinkedHashMap類,所以本質上屬於Map接口的一個實現類

public class ModelMap extends LinkedHashMap<String, Object>

BindingAwareModelMap源碼中繼承ExtendedModelMap類,而ExtendedModelMap這個類又繼承於ModelMap類,同時實現Model接口。

public class BindingAwareModelMap extends ExtendedModelMap
public class ExtendedModelMap extends ModelMap implements Model 

所以Map、Model、ModelMap三者關系如下:

三、使用@SessionAttributes註解處理模型數據

SpringMVC提供瞭一種可以臨時給Session域中保存數據的方式,即使用@SessionAttributes註解,這個註解隻能作用在類上。

//給BindingAwareModelMap中保存的數據,同時在session中也保存一份,value指定保存數據時要給session中放的數據的key
//type隻要是指定的類型的數據,session就會保存
@SessionAttributes(value = "msg",types = {String.class}) 
@Controller
public class OutputController

四、使用@ModelAttribute註解處理模型數據

某些業務場景不需要全字段更新,比如修改book對象信息,bookName隻讀而不能修改,隻有其中某寫字段的值可以修改。如果讓SpringMVC去new一個對象,某些字段會有默認值,將new出來的對象去更新數據庫的值,很有可能會發生null值覆蓋瞭原來不能修改的字段的值。

所以,SpringMVC要封裝請求參數的Book對象不應該是自己new出來的,而應該是從數據庫中取出來的對象,使用這個對象來封裝請求參數,這樣隻是修改瞭指定的字段值,沒有修改的字段值保持原來的值。

@ModelAttribute註解可以加載參數上,也可以加在方法上,如果加在方法上,這個方法就會提前於目標方法運行。也就可以實現提前在數據庫查詢信息,並保存。在參數上加上註解就可以獲取到這個從數據庫中取出的對象,而不是去new一個對象出來。

@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
        
        //參數使用註解,就不會new一個對象,而是使用從數據庫中取出的對象
        return "success";
    }


    @ModelAttribute
    public void modelAttr(Map<String, Object> map){
        o1 = map;
        //此方法從數據庫中取得數據,並提前於目標方法執行
    }
}

兩個方法中的map以及book對象實際上都是同一個BindingAwareModelMap,實現的數據的互通。

總結

到此這篇關於SpringMVC處理數據輸出的文章就介紹到這瞭,更多相關SpringMVC處理數據輸出內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: