看一段普通的代码,我们访问controller中的一个方法后,重定向到另外一个controller或者视图。

    @RequestMapping(params="method=index")public ModelAndView index() {RedirectView redirectView = new RedirectView("/Demo.do?method=index2", true, true);ModelAndView mav = new ModelAndView(redirectView);mav.addObject("attr1", "attr1Value");mav.addObject("attr2", "attr2Value");return mav;}

浏览器的URL会变成http://localhost:8080/FuDeKang/Demo.do?method=index2&attr2=attr2Value&attr1=attr1Value

也就是说Spring会自定把model中的键值放入到URL当中,那么Spring是如何做到的呢,我么还来看ModelAndViewMethodReturnValueHandler这个类。

public class ModelAndViewMethodReturnValueHandler implements HandlerMethodReturnValueHandler {public boolean supportsReturnType(MethodParameter returnType) {return ModelAndView.class.isAssignableFrom(returnType.getParameterType());}public void handleReturnValue(Object returnValue, MethodParameter returnType,ModelAndViewContainer mavContainer, NativeWebRequest webRequest)throws Exception {if (returnValue == null) {mavContainer.setRequestHandled(true);return;}ModelAndView mav = (ModelAndView) returnValue;if (mav.isReference()) {String viewName = mav.getViewName();mavContainer.setViewName(viewName);if (viewName != null && viewName.startsWith("redirect:")) {mavContainer.setRedirectModelScenario(true);}}else {View view = mav.getView();mavContainer.setView(view);if (view instanceof SmartView) {if (((SmartView) view).isRedirectView()) {mavContainer.setRedirectModelScenario(true);}}}mavContainer.addAllAttributes(mav.getModel());}}

其中最后一句是关键,首先modelandview当中的model数据全部放到ModelAndViewContainer 里面。

因为我们是重定向,所以无论如何底层最后产生的视图对象都是RedirectView实例,我们在看一下它的源码。

    /*** Convert model to request parameters and redirect to the given URL.* @see #appendQueryProperties* @see #sendRedirect*/@Overrideprotected void renderMergedOutputModel(Map<String, Object> model, HttpServletRequest request, HttpServletResponse response)throws IOException {String targetUrl = createTargetUrl(model, request);targetUrl = updateTargetUrl(targetUrl, model, request, response);FlashMap flashMap = RequestContextUtils.getOutputFlashMap(request);if (!CollectionUtils.isEmpty(flashMap)) {UriComponents uriComponents = UriComponentsBuilder.fromUriString(targetUrl).build();flashMap.setTargetRequestPath(uriComponents.getPath());flashMap.addTargetRequestParams(uriComponents.getQueryParams());}FlashMapManager flashMapManager = RequestContextUtils.getFlashMapManager(request);flashMapManager.saveOutputFlashMap(flashMap, request, response);sendRedirect(request, response, targetUrl.toString(), this.http10Compatible);}

其中  targetUrl = updateTargetUrl(targetUrl, model, request, response);  是拼接了URL的代码,最后调用sendRedirect做重定向。

SpringMVC RedirectView的使用以及源码分析相关推荐

  1. springmvc项目在启动完成之后执行一次方法_SpringMVC源码分析

    一 SpringMVC运行原理 二 SpingMVC源码分析 1 DispatcherServlet 1.1 DispatcherServlet继承结构 ServletConfig对象获取Init标签 ...

  2. SpringMVC源码分析_1 SpringMVC容器启动和加载原理

                                                                    SpringMVC源码分析_1 SpringMVC启动和加载原理     ...

  3. 详述 Spring MVC 启动流程及相关源码分析

    文章目录 Web 应用部署初始化过程(Web Application Deployement) Spring MVC 启动过程 Listener 的初始化过程 Filter 的初始化 Servlet ...

  4. SpringMVC源码分析系列[转]

    说到java的mvc框架,struts2和springmvc想必大家都知道,struts2的设计基本上完全脱离了Servlet容器,而springmvc是依托着Servlet容器元素来设计的,同时sp ...

  5. SpringMVC源码分析系列

    说到java的mvc框架,struts2和springmvc想必大家都知道,struts2的设计基本上完全脱离了Servlet容器,而springmvc是依托着Servlet容器元素来设计的,同时sp ...

  6. SpringMVC源码分析(二)

    1.DispatcherServlet源码分析 1.@InitBinder(续) 1.DataBinder概述 package org.springframework.validation; 此类所在 ...

  7. SpringBoot-web开发(四): SpringMVC的拓展、接管(源码分析)

    [SpringBoot-web系列]前文: SpringBoot-web开发(一): 静态资源的导入(源码分析) SpringBoot-web开发(二): 页面和图标定制(源码分析) SpringBo ...

  8. SpringMVC之源码分析--ViewResolver(四)

    概述 本章继续学习ViewResolver另一个实现类ContentNegotiatingViewResolver解析器,该类的主要作用是根据同一请求的某些策略,选择对应的View进行渲染.可以把Co ...

  9. SpringMVC异常处理机制详解[附带源码分析]

    SpringMVC异常处理机制详解[附带源码分析] 参考文章: (1)SpringMVC异常处理机制详解[附带源码分析] (2)https://www.cnblogs.com/fangjian0423 ...

最新文章

  1. pcl_filters模块api代码解析
  2. MySQL数据库使用(二):配置、连接远端数据库
  3. Pandas简明教程:九、表的合并、连接、拼接(数据聚合基础)
  4. 转载:python pyppeteer手动、离线安装 chromium
  5. 深度学习Deep Learning: dropout策略防止过拟合
  6. 【Uva11212】 Editing a Book(IDA*)
  7. 学计算机与学英语作文,初二英语作文(关于计算机与学习)
  8. javafx游戏_JavaFX游戏(四连环)
  9. centos7装单机hadoop2.7.3
  10. java 内存泄露 书籍_[Java教程]一次艰难的内存泄露排查,BeanUtils 的锅
  11. 虚拟机克隆后如何修复网络、主机名等问题
  12. day20 python常用模块
  13. 0627-TP整理三(对表的操作,数据的显示)
  14. php smarty 模板注释,smarty中的注释
  15. 跨境电商无货源自发货铺货ERP店群管理软件
  16. 下载SE78里面的图片
  17. DSPE-PEG-cRGD,磷脂-聚乙二醇-环肽RGD,靶向穿膜肽RGD环肽供应
  18. 阿里云服务器端口访问失败 问题解决
  19. 百度地图在地图上添加多个点,并调整地图层级及中心点至合适位置大小
  20. 我讨厌倒文不舞的说教和乱起八糟的技术文章

热门文章

  1. java自带的字节码技术_读懂字节码-还原JAVA源码
  2. 如何linux安装apache服务器,Linux中如何安装Apache服务器
  3. weui.picker 乱码处理
  4. 修改system.img的大小限制
  5. WIN7 运行“计算机管理”出现c:\windows\system32\compmgmt.msc没有被指定在...”错误 解决办法...
  6. 宝宝头三年影响一生[转]
  7. 想快速了解AI各领域的前沿研究成果?可以来这个网站看看 | 资源
  8. 年轻人,AI不想给你加薪升职
  9. DeepMind新突破:雷神之锤3战场AI夺旗,团战胜率超过人类
  10. 小姐姐の福音!美图旗下美妆相机推出AI新功能“发型管家”