SpringMVC RedirectView的使用以及源码分析
看一段普通的代码,我们访问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的使用以及源码分析相关推荐
- springmvc项目在启动完成之后执行一次方法_SpringMVC源码分析
一 SpringMVC运行原理 二 SpingMVC源码分析 1 DispatcherServlet 1.1 DispatcherServlet继承结构 ServletConfig对象获取Init标签 ...
- SpringMVC源码分析_1 SpringMVC容器启动和加载原理
SpringMVC源码分析_1 SpringMVC启动和加载原理 ...
- 详述 Spring MVC 启动流程及相关源码分析
文章目录 Web 应用部署初始化过程(Web Application Deployement) Spring MVC 启动过程 Listener 的初始化过程 Filter 的初始化 Servlet ...
- SpringMVC源码分析系列[转]
说到java的mvc框架,struts2和springmvc想必大家都知道,struts2的设计基本上完全脱离了Servlet容器,而springmvc是依托着Servlet容器元素来设计的,同时sp ...
- SpringMVC源码分析系列
说到java的mvc框架,struts2和springmvc想必大家都知道,struts2的设计基本上完全脱离了Servlet容器,而springmvc是依托着Servlet容器元素来设计的,同时sp ...
- SpringMVC源码分析(二)
1.DispatcherServlet源码分析 1.@InitBinder(续) 1.DataBinder概述 package org.springframework.validation; 此类所在 ...
- SpringBoot-web开发(四): SpringMVC的拓展、接管(源码分析)
[SpringBoot-web系列]前文: SpringBoot-web开发(一): 静态资源的导入(源码分析) SpringBoot-web开发(二): 页面和图标定制(源码分析) SpringBo ...
- SpringMVC之源码分析--ViewResolver(四)
概述 本章继续学习ViewResolver另一个实现类ContentNegotiatingViewResolver解析器,该类的主要作用是根据同一请求的某些策略,选择对应的View进行渲染.可以把Co ...
- SpringMVC异常处理机制详解[附带源码分析]
SpringMVC异常处理机制详解[附带源码分析] 参考文章: (1)SpringMVC异常处理机制详解[附带源码分析] (2)https://www.cnblogs.com/fangjian0423 ...
最新文章
- pcl_filters模块api代码解析
- MySQL数据库使用(二):配置、连接远端数据库
- Pandas简明教程:九、表的合并、连接、拼接(数据聚合基础)
- 转载:python pyppeteer手动、离线安装 chromium
- 深度学习Deep Learning: dropout策略防止过拟合
- 【Uva11212】 Editing a Book(IDA*)
- 学计算机与学英语作文,初二英语作文(关于计算机与学习)
- javafx游戏_JavaFX游戏(四连环)
- centos7装单机hadoop2.7.3
- java 内存泄露 书籍_[Java教程]一次艰难的内存泄露排查,BeanUtils 的锅
- 虚拟机克隆后如何修复网络、主机名等问题
- day20 python常用模块
- 0627-TP整理三(对表的操作,数据的显示)
- php smarty 模板注释,smarty中的注释
- 跨境电商无货源自发货铺货ERP店群管理软件
- 下载SE78里面的图片
- DSPE-PEG-cRGD,磷脂-聚乙二醇-环肽RGD,靶向穿膜肽RGD环肽供应
- 阿里云服务器端口访问失败 问题解决
- 百度地图在地图上添加多个点,并调整地图层级及中心点至合适位置大小
- 我讨厌倒文不舞的说教和乱起八糟的技术文章
热门文章
- java自带的字节码技术_读懂字节码-还原JAVA源码
- 如何linux安装apache服务器,Linux中如何安装Apache服务器
- weui.picker 乱码处理
- 修改system.img的大小限制
- WIN7 运行“计算机管理”出现c:\windows\system32\compmgmt.msc没有被指定在...”错误 解决办法...
- 宝宝头三年影响一生[转]
- 想快速了解AI各领域的前沿研究成果?可以来这个网站看看 | 资源
- 年轻人,AI不想给你加薪升职
- DeepMind新突破:雷神之锤3战场AI夺旗,团战胜率超过人类
- 小姐姐の福音!美图旗下美妆相机推出AI新功能“发型管家”