1. 程式人生 > >springmvc-Model和ModelAndView的區別以及和request的區別

springmvc-Model和ModelAndView的區別以及和request的區別

 

前言

        用過springMvc的小夥伴都知道,一般而言我們返回頁面檢視的時候會有兩種可能,就是本文題目中的兩個類。其實本文就是想要對比一下這兩個類在spring的檢視解析中的作用以及區別。

區別

        就我個人而言,我自己覺得這兩者之間是沒有什麼區別的?實際上,這兩者之間有著很大的區別,具體就表現在Model只是用來傳輸資料的,並不會進行業務的定址。但是,ModelAndView卻是可以進行業務定址的,就是設定對應的要請求的靜態檔案,這裡的靜態檔案指的是類似jsp的檔案。當然,兩者還有一個最大的區別,那就是Model是每一次請求都必須會帶著的,但是ModelAndView是需要我們自己去新建的。

程式碼示例

        首先是Model傳遞資料。

@Controller
public class FreemarkerController {
    @SuppressWarnings("unchecked")
    @RequestMapping(method = RequestMethod.POST, value = "/freemarker")
    public String getFtl(Model model) {
        // 構造填充資料的Map
        Map map = new HashMap();
        List<TestVo> testVos = new ArrayList<>();
        TestVo testVo = new TestVo();
        testVo.setName("fulei");
        TestVo testVo1 = new TestVo();
        testVo1.setName("wangmeng");
        testVos.add(testVo);
        testVos.add(testVo1);
        map.put("user", "love");
        map.put("url", "http://www.baidu.com/");
        map.put("name", "百度");
        map.put("testVos", testVos);
        model.addAllAttributes(map);
        return "test";
    }
}

        其次就是ModelAndView。

    @RequestMapping(method = RequestMethod.POST, value = "/freemarker")
    public ModelAndView getFtlByModelAndView() {
        ModelAndView modelAndView = new ModelAndView();
        // 構造填充資料的Map
        Map map = new HashMap();
        List<TestVo> testVos = new ArrayList<>();
        TestVo testVo = new TestVo();
        testVo.setName("fulei");
        TestVo testVo1 = new TestVo();
        testVo1.setName("wangmeng");
        testVos.add(testVo);
        testVos.add(testVo1);
        map.put("user", "love");
        map.put("url", "http://www.baidu.com/");
        map.put("name", "百度");
        map.put("testVos", testVos);
        modelAndView.addAllObjects(map);
        return modelAndView;
    }

        從上面我們可以看得出來這兩個之間還是有一定的區別的,當然具體的區別也就如我上面所描述的那樣了。

Model

其實model和session都是存放資訊的地方,不同的地方就是他們的生命週期不同,model是request級別的。

ModelandView是將  檢視資訊和資料封裝到一起的,spring來解析ModelandView中的資訊,包括檢視和資料 ,然後將資料set到request裡面,並且根據model裡面的檢視資訊以及spring mvc的配置讓request進行跳轉。

springMVC的工作原理如下:

  • springmvc請所有的請求都提交給DispatcherServlet,它會委託應用系統的其他模組負責負責對請求進行真正的處理工作。 

  • DispatcherServlet查詢一個或多個HandlerMapping,找到處理請求的Controller。

  • DispatcherServlet請請求提交到目標Controller 。

  • Controller進行業務邏輯處理後,會返回一個ModelAndView 。

  • Dispathcher查詢一個或多個ViewResolver檢視解析器,找到ModelAndView物件指定的檢視物件 。

  • 檢視物件負責渲染返回給客戶端。