技术交流群: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重定向和转发相关推荐

  1. Spring MVC重定向和转发及异常处理

    SpringMVC核心技术---转发和重定向 当处理器对请求处理完毕后,向其他资源进行跳转时,有两种跳转方式:请求转发与重定向.而根据要跳转的资源类型,又可分为两类:跳转到页面与跳转到其他处理器. 对 ...

  2. springmvc重定向到另一个项目_Spring MVC重定向和转发详解

    Spring MVC请求方式分为转发.重定向两种,是用forward和redirect关键字在controller层进行处理.本文我们就来探讨一下Spring MVC请求方式中的Spring MVC重 ...

  3. spring mvc重定向_Spring的Web MVC –重定向到内存泄漏

    spring mvc重定向 他们说一块岩石会引起雪崩. 最近,我的一位同事Marcin Radoszewski给了我一块岩石. 您可能永远不会猜到它是什么,但是有机会在许多Web应用程序中使用它. 请 ...

  4. spring mvc 入门DispatcherServlet转发

    目录 一,配置相关 二,java类测试 三,测试 一,配置相关 maven坐标依赖 <dependencies><!-- spring context --><depen ...

  5. Spring mvc 重定向

    @RequestMapping("/test") public void testVoid(HttpServletRequest request, HttpServletRespo ...

  6. Spring MVC框架——Web开发框架

    1.MVC设计模式 一般指MVC框架,M(Model)数据模型层,V(View)视图层,C(Controller)控制层. Controller层:获取用户的请求,处理相关业务逻辑,并成功跳转页面,负 ...

  7. 【Java学习路线之JavaWeb】Spring MVC框架入门教程

    文章目录 读者 阅读条件 MVC设计模式简介 JSP+JavaBean Servlet+JSP+JavaBean MVC优缺点 优点 缺点 Spring MVC是什么 Spring MVC优点 第一个 ...

  8. spring mvc controller间跳转 重定向 传参

    spring mvc controller间跳转 重定向 传参 1. 需求背景     需求:spring MVC框架controller间跳转,需重定向.有几种情况:不带参数跳转,带参数拼接url形 ...

  9. 【Spring-MVC基础】由浅入深-Spring MVC

    本文致力于由浅入深的去介绍,使用Spring MVC:细节比较多,希望能对正在观看的你有所帮助! 博主水平有限,难免存在缺陷和错误,欢迎大佬的指出与补充,谢谢! 0x01.认识Spring MVC 1 ...

最新文章

  1. python 获取窗口句柄_Python文件读写最详细的讲解
  2. python培训中心-想学python,上海Python培训中心哪个好?
  3. IOS开发基础知识--碎片8
  4. 在JVM之下–类加载器
  5. muduo网络库源码阅读Step by Step
  6. 带你一步一步深入Handler源码,醍醐灌顶!
  7. python 把中文句子分割成一个一个的字(英文适用)
  8. [Ext JS] 3.5 单选框 Radio与复选框CheckBox
  9. document.write vs document.getElementById
  10. BUG报告:habahaba风格,图片显示有问题
  11. ai人工智能操控什么意思_为什么AI会(永远)接管
  12. 共享计算机无法打开文件,Windows7局域网无法打开共享文件分析
  13. 迭代回溯的图最大团问题(可得到多组最优解)
  14. 静态化freemarker,分布式文件系统minIO
  15. hadoop is not in the sudoers file. This incident will be reported.问题解决
  16. 4.4.1. SWE.1 Software Requirements Analysis中“Process outcomes”的第一条的正确翻译
  17. IEEE 802.11 无线局域网络 (Wireless LAN)
  18. MySQL中添加唯一约束和联合唯一约束
  19. python正则表达式联系
  20. 浮世三千,我爱有三。

热门文章

  1. UVa 1642 (综合) Magical GCD
  2. 三款Scrum项目管理工具
  3. flutter底部导航栏
  4. java基础基本数据类型对象包装
  5. Java 8.if语句
  6. 查看本机装的 JDK 是32位还是64位的
  7. 自动化运维工具Ansible实战(四)常用模块
  8. 1001.A+B Format (20) 解题
  9. 关于JS闭包,作者不详(转)
  10. spark视频-Spark on Yarn