Spring MVC重定向和转发
技术交流群:233513714
转发和重定向
开始Java EE时,可能会对转发(forward)和重定向(redirect)这个两个概念不清楚。本文先通过代码实例和运行结果图片感性 认识二者的区别,然后给出二者的定义。
1、常规用法,返回一个View
@RequestMapping(value="/testa", method=RequestMethod.GET)
public String inputData(){return "testa"; //Spring框架找到对应的View并渲染 } @RequestMapping(value="/testa", method=RequestMethod.POST) public String outputData(HttpServletRequest request){ String userName = request.getParameter("name"); String password = request.getParameter("pwd"); request.setAttribute("name", userName); request.setAttribute("pwd", password); return "testb"; //Spring框架找到对应的View并渲染 }
打开testa网页:
输入用户名:spring,密码:spring:
点击登陆按钮,页面变为如下:
再次刷新,谷歌浏览器提示重新提交表单。
对比图片,发现浏览器的输入框中URL不变,但是不同情况下显示不同的View。跳转时Model共享(表单会被重复提交)。
2、转发(forward)
@RequestMapping(value="/testa", method=RequestMethod.GET)
public String inputData(){return "testa"; //Spring框架找到对应的View并渲染 } @RequestMapping(value="/testa", method=RequestMethod.POST) public String outputData(HttpServletRequest request){ String userName = request.getParameter("name"); String password = request.getParameter("pwd"); request.setAttribute("name", userName); request.setAttribute("pwd", password); //转发到 /testb 的Controller方法(即outputDataX)上 return "forward:/testb"; } @RequestMapping(value="/testb", method=RequestMethod.POST) public String outputDataX(HttpServletRequest request){ return "testb"; }
打开testa网页:
输入用户名:spring,密码:spring:
点击登陆按钮,页面变为如下:
调试分析:forward后面跟一个资源。当程序运行到return “forward:/testb”时,会执行会执行该资源对应的方法outputDataX。
另外转发时,浏览器的URL不变。
再次刷新,谷歌浏览器提示重新提交表单。
3、重定向(redirect)
@RequestMapping(value="/testa", method=RequestMethod.GET)
public String inputData(){return "testa"; //Spring框架找到对应的View并渲染 } @RequestMapping(value="/testa", method=RequestMethod.POST) public String outputData(HttpServletRequest request){ String userName = request.getParameter("name"); String password = request.getParameter("pwd"); request.setAttribute("name", userName); request.setAttribute("pwd", password); //重定向到 /testb 的Controller方法(即outputDataY)上 return "redirect:/testb"; } @RequestMapping(value="/testb", method=RequestMethod.POST) public String outputDataX(HttpServletRequest request){ return "testb"; } @RequestMapping(value="/testb", method=RequestMethod.GET) public String outputDataY(HttpServletRequest request){ return "testb"; }
打开testa网页:
输入用户名:spring,密码:spring:
点击登陆按钮,页面变为如下:
调试分析:redirect后面跟一个资源。当执行到return “redirect:/testb”时,会执行该资源对应个方法outputDataY。由于重定向Model不共享,所以页面无数据显示。
另外重定向后浏览器的输入框中URL也发生变化。
刷新后,谷歌浏览器没有提示重新提交表单
总结:
常说的可以通过redirect: URL防止重复提交表单,就是上面过程的意思。
原理是对于redirect而言,Request的attribute不会被传递,放到session中,session在跳到页面后马上移除对象。所以你刷新一下后这个值就会丢掉。
如果你希望Request的attribute被传递,可以使用RedirectAttributes类。
@RequestMapping(value="/testa", method=RequestMethod.GET)public String inputData(){return "testa"; //Spring框架找到对应的View并渲染 } @RequestMapping(value="/testa", method=RequestMethod.POST) public String outputData(HttpServletRequest request, RedirectAttributes redirectAttributes){ String userName = request.getParameter("name"); String password = request.getParameter("pwd"); request.setAttribute("name", userName); request.setAttribute("pwd", password); //重定向到 /testb 的Controller方法(即outputDataY)上 //重定向传递参数的两种方法 redirectAttributes.addAttribute("name", userName); redirectAttributes.addFlashAttribute("pwd", password); return "redirect:/testb"; } @RequestMapping(value="/testb", method=RequestMethod.POST) public String outputDataX(HttpServletRequest request){ return "testb"; } @RequestMapping(value="/testb", method=RequestMethod.GET) public String outputDataY(HttpServletRequest request){ String userName = request.getParameter("name"); request.setAttribute("name", userName); return "testb"; }
运行如下:
上面示例了使用RedirectAttributes传递参数的两种方法:
1. 使用RedirectAttributes类的addAttribute方法传递参数会跟随在URL后面,如上图谷歌浏览器所示,URL为http://localhost:8080/testb?name=spring
2. 使用RedirectAttributes类的addFlashAttribute方法传递参数不会跟随在URL后面,会把该参数值暂时保存于session,待重定向URL获取该参数后从session中移除,这里的redirect必须是方法映射路径,jsp无效。你会发现redirect后的jsp页面中pwd只会出现一次,刷新后pwd再也不会出现了。下图为刷新后的结果,密码pwd显示为空。这验证了上面说的,pwd在被访问后就会从session中移除。对于防止重复提交可以使用此方法。
定义
作为一个经验丰富的servlet/JSP程序员,必须知道转发和重定向的区别。 转发比重定向快,因为重定向经过客服端,而转发没有。但是,又是采用重定向更好,若需要重定向到一个外部网站,则无法使用转发。
个人理解:好比服务器窗口A点餐,窗口B取餐。转发就是浏览器到服务器窗口A点餐,点完餐后,服务器内部从窗口B取餐,把饭菜直接给浏览器。重定向就是浏览器到服务器窗口A点餐,服务器不帮助浏览器从窗口B取餐,而是告知浏览器到B取餐。浏览器得到信息后再向窗口B发出取餐要求。
转载于:https://www.cnblogs.com/cnndevelop/p/8351079.html
Spring MVC重定向和转发相关推荐
- Spring MVC重定向和转发及异常处理
SpringMVC核心技术---转发和重定向 当处理器对请求处理完毕后,向其他资源进行跳转时,有两种跳转方式:请求转发与重定向.而根据要跳转的资源类型,又可分为两类:跳转到页面与跳转到其他处理器. 对 ...
- springmvc重定向到另一个项目_Spring MVC重定向和转发详解
Spring MVC请求方式分为转发.重定向两种,是用forward和redirect关键字在controller层进行处理.本文我们就来探讨一下Spring MVC请求方式中的Spring MVC重 ...
- spring mvc重定向_Spring的Web MVC –重定向到内存泄漏
spring mvc重定向 他们说一块岩石会引起雪崩. 最近,我的一位同事Marcin Radoszewski给了我一块岩石. 您可能永远不会猜到它是什么,但是有机会在许多Web应用程序中使用它. 请 ...
- spring mvc 入门DispatcherServlet转发
目录 一,配置相关 二,java类测试 三,测试 一,配置相关 maven坐标依赖 <dependencies><!-- spring context --><depen ...
- Spring mvc 重定向
@RequestMapping("/test") public void testVoid(HttpServletRequest request, HttpServletRespo ...
- Spring MVC框架——Web开发框架
1.MVC设计模式 一般指MVC框架,M(Model)数据模型层,V(View)视图层,C(Controller)控制层. Controller层:获取用户的请求,处理相关业务逻辑,并成功跳转页面,负 ...
- 【Java学习路线之JavaWeb】Spring MVC框架入门教程
文章目录 读者 阅读条件 MVC设计模式简介 JSP+JavaBean Servlet+JSP+JavaBean MVC优缺点 优点 缺点 Spring MVC是什么 Spring MVC优点 第一个 ...
- spring mvc controller间跳转 重定向 传参
spring mvc controller间跳转 重定向 传参 1. 需求背景 需求:spring MVC框架controller间跳转,需重定向.有几种情况:不带参数跳转,带参数拼接url形 ...
- 【Spring-MVC基础】由浅入深-Spring MVC
本文致力于由浅入深的去介绍,使用Spring MVC:细节比较多,希望能对正在观看的你有所帮助! 博主水平有限,难免存在缺陷和错误,欢迎大佬的指出与补充,谢谢! 0x01.认识Spring MVC 1 ...
最新文章
- python 获取窗口句柄_Python文件读写最详细的讲解
- python培训中心-想学python,上海Python培训中心哪个好?
- IOS开发基础知识--碎片8
- 在JVM之下–类加载器
- muduo网络库源码阅读Step by Step
- 带你一步一步深入Handler源码,醍醐灌顶!
- python 把中文句子分割成一个一个的字(英文适用)
- [Ext JS] 3.5 单选框 Radio与复选框CheckBox
- document.write vs document.getElementById
- BUG报告:habahaba风格,图片显示有问题
- ai人工智能操控什么意思_为什么AI会(永远)接管
- 共享计算机无法打开文件,Windows7局域网无法打开共享文件分析
- 迭代回溯的图最大团问题(可得到多组最优解)
- 静态化freemarker,分布式文件系统minIO
- hadoop is not in the sudoers file. This incident will be reported.问题解决
- 4.4.1. SWE.1 Software Requirements Analysis中“Process outcomes”的第一条的正确翻译
- IEEE 802.11 无线局域网络 (Wireless LAN)
- MySQL中添加唯一约束和联合唯一约束
- python正则表达式联系
- 浮世三千,我爱有三。