本文转载自“独钓渔”的博客
(一) java web编程中的forward和redirect
在java web编程中跳转有两种:” 1:forward ,2:redirect。

我的理解是:forward是请求转发,redirect是重定向。

forward(请求转发):
可以看出是统一次请求,当request到达这个servlet后又看到又forward又将当前的request继续转发到forward的地址去,在这个过程中,可以利用request.setAttribute设置一些转发的属性,都会被带到目标servlet中去,目标servlet可以通过request.getparam来获取原始的request请求,也可通过request.getAttribute来获取转发过程中的设置的属性。

redirect(重定向):
redirect重定向,基本可以理解为响应了301,302等之类的,你重新安装redirect新地址去重新请求。所有一般来说redirect不能带model信息,无法像forward利用request.setAttribute来设置一些转发属性,如果重定向到外部应用只有通过GET提交方式传递数据,如果是重定向到应用自己内部的其它地址,则还可以利用session实现数据传递。

自己总结:
可以理解为forward过程发生在request过程中,redirect发生在response过程中。从浏览器来看,forward是一次请求,转发过程在Servlet容器中完成,所有目标Servlet返回信息就会在当前的请求response中,浏览器地址不变;而redirect是重定向,这次请求的servlet响应,响应的response内容为一个redirect, 浏览器收到这个redirect后重新发起一个新的request请求到redirect这个目标地址,在由这个目标地址的Servlet来响应返回的内容。也正是应为如此,forward(请求转发)只能用在同一个应用中。而redirect可以重定向到其他外部应用中去。

在redirect过程中是一次完全重新的GET请求,如果要在redircet中带数据转发只有这一种方式(利用GET请求时把参数带上)。

eg1  redirect:/path/list?prama1=values1&prama2=values2eg2  redirect:http://api.xxx.com/path/list?prama1=values1&prama2=values2

如果redirect是以/开始这会认为是同一应用中(如eg1),那么他们直接的数据传递还可以利用session实现。

(二) 说说springmvc中的forward和redirect
springmvc完成forward和redirect时本质也是一样。

Spring MVC 中,我们在返回逻辑视图时,框架会通过 viewResolver 来解析得到具体的 View,然后向浏览器渲染。假设逻辑视图名为 hello,通过配置,我们配置某个 ViewResolver 如下:

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">  <description>  假如逻辑试图名为 "hello",因此 viewResolver 将解析成 /WEB-INF/jsp/hello.jsp  </description>  <property name="prefix" value="/WEB-INF/jsp/" />  <property name="suffix" value=".jsp" />
</bean>  

实际上,框架还是通过 forward 的方式转发到了 /WEB-INF/jsp/hello.jsp。如果逻辑视图名是 /hello,实际还是转发到了 /WEB-INF/jsp/hello.jsp,即 /WEB-INF/jsp//hello.jsp 等同于 /WEB-INF/jsp/hello.jsp。

现在有个问题,如果 /hello 就是某个 controller 的映射,我想转发到这个 controller,怎么办?我们可以通过forward 前缀来达到转发到其它资源的目的:

public String handle() {  // return "forward:/hello" => 转发到能够匹配 /hello 的 controller 上  // return "hello" => 实际上还是转发,只不过是框架会找到该逻辑视图名对应的 View 并渲染  // return "/hello" => 同 return "hello"  return "forward:/hello";
}  

同理,如果我们想重定向到某个资源,我们可以通过 redirect 前缀来达到重定向到其它资源的目的:

public String handle() {  // 重定向到 /hello 资源  return "redirect:/hello";
}  

forward(请求转发)因为有request.setAttribute方法所以请求转发过程中增加一些请求属性都是非常容易的事情。

redirect(重定向)要想在重定向过程中传递数据相对麻烦得多。

1,redirect到外部应用时,只有通过get提交方式传递数据(如eg2)。

2,redircet到应用自己的其它地址时,可以通过get提交方式传递数据(如eg1),还可通过session方式传递数据。

Spring MVC中有RedirectAttributes类专门用于重定向之后还能带参数跳转的的工具类。

他有两种带参的方式:

第一种:
redirectAttributes.addAttributie(“prama”,value); 这种方法相当于在重定向链接地址追加传递的参数,例如:

redirectAttributes.addAttributie("prama1",value1);
redirectAttributes.addAttributie("prama2",value2);
return:"redirect:/path/list" 

以上重定向的方法等同于 return:”redirect:/path/list?prama1=value1&prama2=value2”

第二种:
redirectAttributes.addFlashAttributie(“prama”,value); 这种方法是隐藏了参数,链接地址上不直接暴露,但是能且只能在重定向的 “页面” 获取prama参数值。其原理就是放到session中,session在跳到页面后马上移除对象。如果是重定向一个controller中是获取不到该prama属性值的。除非在controller中用(@RequestPrama(value = “prama”)String prama)注解,采用传参的方式。页面获值例如:

redirectAttributes.addFlashAttributie("prama1",value1);
redirectAttributes.addFlashAttributie("prama2",value2);
return:"redirect:/path/list.jsp"
在以上参数均可在list.jsp页面使用EL表达式获取到参数值${prama*}
controller获得redirectAttributes重定向的值例如:redirectAttributes.addFlashAttributie("prama1",value1);
redirectAttributes.addFlashAttributie("prama2",value2);
return:"redirect:/path/list"@RequestMapping("list")
public List<Student> list(@RequestPrama(value = "prama1")String  prama1,@RequestPrama(value = "prama2")String  prama2,...
){//TODO
}

这可以在controller中获取redirect传过来的值。

springmvc中使用forward和redirect相关推荐

  1. Jsp中的forward 和 redirect

    Jsp中的forward 和 redirect 一.绝对路径和相对路径 相对路径 绝对路径 二.实现机制 Forward:转发----服务器行为 Redirect:重定向----客户端行为 三.运用场 ...

  2. web中的forward和redirect区别

    forward 和 redirect 重定向的特点 redirect 转发地址栏路径不变 重定向可以访问其他站点的资源,可以理解其他服务器的资源 重定向是两次请求.不能使用request对象来共享数据 ...

  3. Spring MVC 中的 forward 和 redirect

    Spring MVC 中,我们在返回逻辑视图时,框架会通过 viewResolver 来解析得到具体的 View,然后向浏览器渲染.假设逻辑视图名为 hello,通过配置,我们配置某个 ViewRes ...

  4. 《Spring实战》读书笔记--SpringMVC之forward与redirect

    <Spring实战>读书笔记--SpringMVC之forward与redirect 1.forward与redirect介绍 1.1 redirect 重定向,服务器收到请求后发送一个状 ...

  5. #SpringMVC:转发、重定向(关键字方式) #forward、redirect关键字 @FDDLC

    示例: 关于在SpringMVC中使用forward.redirect关键字的说明: 1.这两种方式都不经过视图解析器,因此需要自己加前后缀. 2.[SpringMVC中使用关键字的重定向]和[传统的 ...

  6. Servlet中forward和redirect的区别(转)

    forward方式:request.getRequestDispatcher("/somePage.jsp").forwardrequest, response);      re ...

  7. Servlet API中forward()与redirect()的区别?

    Servlet API中forward()与redirect()的区别? a.从地址栏显示来说 forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这 ...

  8. java中forward和redirect_java中转发forward和重定向redirect的区别

    Forward(转发) 是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是 ...

  9. java中forward和redirect_好程序员Java教程分享:Forward和Redirect的区别

    Java教程分享:Forward和Redirect的区别,用户向服务器发送了一次HTTP请求,该请求可能会经过多个信息资源处理以后才返回给用户,各个信息资源使用请求转发机制相互转发请求,但是用户是感觉 ...

  10. Java Web中Forward和redirect的区别

    导读:Servlet有三种协作方案:Forward协作.Include协作.重定向协议(Redirect). include协作就是一个servlet包含了另一个servlet的全部内容 那么,For ...

最新文章

  1. AngularJS ng-if使用
  2. 图解web前端开发工具教程
  3. Oracle 11g系统自动收集统计信息
  4. 关于使用public class 和 class声明类的区别
  5. java如何关闭creo,creo怎么把网页关掉
  6. C#: using JsonReader avoid Deserialize Json to dynamic
  7. python里eval和input组合使用_python中eval()函数和input()函数用法解析
  8. 计算机附件中的超级终端,windows10系统中附件中没有超级终端怎么解决
  9. 杰理AC692X---691X,690X,692X芯片差异(2)
  10. 使用liteide开发go遇到的问题
  11. 一周小结(2019/12/23)
  12. 奇异谱分析(SSA)的matlab实现
  13. PS小知识(五)——羽化(图片拼接后去缝、自然过渡渐变)
  14. ProFTPD对接LDAP
  15. Python数据分析--统计注册用户
  16. python的return详解。
  17. C#常见容器ArrayList、List、HashSet、Hashtable 、Dictionary、Stack、Queue
  18. 《大数据架构和算法实现之路:电商系统的技术实战》——2.4 案例实践
  19. ORACLE12.2 RAC+DG(2+1) RU patch步骤
  20. 运行node时报错:events.js:167 throw er; // Unhandled 'error' event

热门文章

  1. Resource compilation failed. Check logs for details.
  2. SpringBoot应用监控(带邮件警报)
  3. 华硕主板刷机后不能进入Windows的解决办法
  4. 神经网络参数初始化方法
  5. 触动人心的手机端页面设计
  6. AI 成野生动物保护神:没有图像识别算法,考拉可能灭绝!
  7. @property基本概念
  8. 自定义view之无限滚动的刻度尺
  9. 网络协议之Netflow与sFlow协议
  10. 基于金笛短信Web中间件实现Cacti短信报警