<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
為什麼在Model和Map中放值傳入後會出現在request的上面。
準備測試程式碼
@GetMapping("/goto") public String go(HttpServletRequest request, Map<String,Object> map, Model model){ request.setAttribute("msg","傳過來...."); map.put("map","map hello word!!"); model.addAttribute("model","model hello word!!"); return "forward:success"; } @ResponseBody @GetMapping("/success") public Map success(@RequestAttribute(value = "msg",required = false) String msg, HttpServletRequest request){ Map<String,Object> hashMap = new HashMap<>(); Object msg1 = request.getAttribute("msg"); Object map = request.getAttribute("map"); Object model = request.getAttribute("model"); hashMap.put("map1",map); hashMap.put("model",model); hashMap.put("msg1",msg1); return hashMap; }
第一步進入DispatchServlet 的 doDispatch中
主要的三步
DispatchServlet類中的 doDispatch方法 // Determine handler for the current request. mappedHandler = getHandler(processedRequest);//獲取反射的方法處理器 // Determine handler adapter for the current request. //獲取引數處理器 HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler()); // Actually invoke the handler. //反射執行方法和解析Model和Map mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
在獲取引數階段,解Model和Map
MapMethodProcessor類中的 @Override @Nullable public Object resolveArgument(MethodParameter parameter, @Nullable ModelAndViewContainer mavContainer, NativeWebRequest webRequest, @Nullable WebDataBinderFactory binderFactory) throws Exception { Assert.state(mavContainer != null, "ModelAndViewContainer is required for model exposure"); return mavContainer.getModel(); } 然後進入ModelAndViewContainer類中的 private final ModelMap defaultModel = new BindingAwareModelMap(); public ModelMap getModel() { if (useDefaultModel()) { return this.defaultModel;//獲取ModelMap } ......
ModelMethodProcessor類中的 @Override @Nullable public Object resolveArgument(MethodParameter parameter, @Nullable ModelAndViewContainer mavContainer, NativeWebRequest webRequest, @Nullable WebDataBinderFactory binderFactory) throws Exception { Assert.state(mavContainer != null, "ModelAndViewContainer is required for model exposure"); return mavContainer.getModel(); } 然後進入ModelAndViewContainer類中的 private final ModelMap defaultModel = new BindingAwareModelMap(); public ModelMap getModel() { if (useDefaultModel()) { return this.defaultModel;//獲取ModelMap 這個和那個Map獲取的是同一個 } ......
把同一個ModelMap物件返回
反射呼叫方法
由於是同一個物件所有 map 和 model中的值都樣,所以往map和Model放值都一樣
把model和map的資料放入request
第一步
ServletInvocableHandlerMethod類中 invokeAndHandle方法 //獲取返回值的一個處理器 try { this.returnValueHandlers.handleReturnValue( returnValue, getReturnValueType(returnValue), mavContainer, webRequest); } HandlerMethodReturnValueHandlerComposite類中的 HandlerMethodReturnValueHandler方法 進行獲取
這裡獲取的ViewNameMethodReturnValueHandler
這個處理器
第二步
把Map和 Model攜帶的引數和返回值(路徑)進行整合為ModelAndView
RequestMappingHandlerAdapter類中 handleInternal方法 ... ModelAndView mav; ... mav = invokeHandlerMethod(request, response, handlerMethod); ...
第三步
準備派發和放入引數
DispatchServlet類中的 doDispatch方法 render(mv, request, response); view.render(mv.getModelInternal(), request, response); AbstractView類中的 render方法 //把BindingAwareModelMap的引數封裝為Map Map<String, Object> mergedModel = createMergedOutputModel(model, request, response); prepareResponse(request, response); //準備方法和放入引數到reques中 renderMergedOutputModel(mergedModel, getRequestToExpose(request), response); InternalResourceView類中的 renderMergedOutputModel // Expose the model object as request attributes. exposeModelAsRequestAttributes(model, request);//把引數放入到request中 AbstractView類中的 //把引數放入到原生的request域中 protected void exposeModelAsRequestAttributes(Map<String, Object> model, HttpServletRequest request) throws Exception { model.forEach((name, value) -> { if (value != null) { request.setAttribute(name, value); } else { request.removeAttribute(name); } }); }
到此這篇關於Spring的Model 和 Map的原理原始碼解析的文章就介紹到這了,更多相關Spring Model 和 Map內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45