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

时间: 2024-10-09 00:29:01

Spring MVC重定向和转发的相关文章

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

SpringMVC核心技术---转发和重定向 当处理器对请求处理完毕后,向其他资源进行跳转时,有两种跳转方式:请求转发与重定向.而根据要跳转的资源类型,又可分为两类:跳转到页面与跳转到其他处理器.对于请求转发的页面,也可以是WEB-INF中页面:对于重定向的页面,不能为WEB-INF中的页面.因为重定向相当于用户再次发出一次请求,而用户是不能直接访问WEB-INF中资源的 1)重定向到页面 FirstController.java package cn.controller; import or

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

SpringMVC核心技术---转发和重定向 当处理器对请求处理完毕后,向其他资源进行跳转时,有两种跳转方式:请求转发与重定向.而根据要跳转的资源类型,又可分为两类:跳转到页面与跳转到其他处理器.对于请求转发的页面,也可以是WEB-INF中页面:对于重定向的页面,不能为WEB-INF中的页面.因为重定向相当于用户再次发出一次请求,而用户是不能直接访问WEB-INF中资源的 1)重定向到页面 FirstController.java package cn.controller; import or

spring mvc 重定向加传参

常用: ModelAndViewi: return new ModelAndView("redirect:/toList");  或者 ii:return "redirect:/toList"; 或者 iii:response.sendRedirect("index.html"); 1. 需求背景    需求:spring MVC框架controller间跳转,需重定向.有几种情况:不带参数跳转,带参数拼接url形式跳转,带参数不拼接参数跳转,页

spring mvc 重定向,转发和传参

重定向: (1)第一种情况:不需要传递参数. 方式一:使用ModelAndView return new ModelAndView("redirect:/toList"); 这样可以重定向到toList这个方法 方式二:返回String return "redirect:/ toList "; (2)第二种情况:带参数 拼接url,用RedirectAttributes,这里用它的addAttribute方法,这个实际上重定向过去以后你看url ,是它自动给你拼了你

spring mvc重定向

一.不带参数,直接重定向到另一个地址: 返回String直接跳转,如: @RequestMapping(value = "/filehandle") public String upload(){ return "redirect:/upload.jsp"; } 或者使用使用ModelAndView跳转 @RequestMapping(value = "/filehandle") public ModelAndView upload(){ ret

spring mvc重定向页面

@RequestMapping(value="/del/{id}") public String delUser(@PathVariable int id){ return "redirect:/user"; } 直接返回redirect:/user,就可以返回到user页面. 2.重定向如何带参数. @RequestMapping(value="/del/{id}", method=RequestMethod.GET, produces=&qu

spring mvc 重定向传参

参考链接如下: http://bbs.csdn.net/topics/391034118?page=1 自己的示例程序: 详细页面提交一个修改动作,修改完成后跳转到检索页面. 本地controller 1 private static final String SEARCH_PAGE = "redirect:/list/search.do"; 2 3 @RequestMapping(value = "/update", method=RequestMethod.PO

Spring MVC 重定向

@RequestMapping("/testRedirect") public String testRedirect(){ System.out.println("testRedirect"); return "redirect:/index.jsp"; } 原理: 找到ModelAndView 进入UrlBaseViewResolver类createView方法() 原文地址:https://www.cnblogs.com/eason-d/p

spring mvc 请求转发和重定向

spring mvc controller间跳转 重定向 传参 url:http://zghbwjl.blog.163.com/blog/static/12033667220137795252845/ 1. 需求背景    需求:spring MVC框架controller间跳转,需重定向.有几种情况:不带参数跳转,带参数拼接url形式跳转,带参数不拼接参数跳转,页面也能显示. 本来以为挺简单的一件事情,并且个人认为比较常用的一种方式,一百度全都有了,这些根本不是问题,但是一百度居然出乎我的意料