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物件指定的檢視物件 。
-
檢視物件負責渲染返回給客戶端。