springmvc中使用forward和redirect
本文转载自“独钓渔”的博客
(一) 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相关推荐
- Jsp中的forward 和 redirect
Jsp中的forward 和 redirect 一.绝对路径和相对路径 相对路径 绝对路径 二.实现机制 Forward:转发----服务器行为 Redirect:重定向----客户端行为 三.运用场 ...
- web中的forward和redirect区别
forward 和 redirect 重定向的特点 redirect 转发地址栏路径不变 重定向可以访问其他站点的资源,可以理解其他服务器的资源 重定向是两次请求.不能使用request对象来共享数据 ...
- Spring MVC 中的 forward 和 redirect
Spring MVC 中,我们在返回逻辑视图时,框架会通过 viewResolver 来解析得到具体的 View,然后向浏览器渲染.假设逻辑视图名为 hello,通过配置,我们配置某个 ViewRes ...
- 《Spring实战》读书笔记--SpringMVC之forward与redirect
<Spring实战>读书笔记--SpringMVC之forward与redirect 1.forward与redirect介绍 1.1 redirect 重定向,服务器收到请求后发送一个状 ...
- #SpringMVC:转发、重定向(关键字方式) #forward、redirect关键字 @FDDLC
示例: 关于在SpringMVC中使用forward.redirect关键字的说明: 1.这两种方式都不经过视图解析器,因此需要自己加前后缀. 2.[SpringMVC中使用关键字的重定向]和[传统的 ...
- Servlet中forward和redirect的区别(转)
forward方式:request.getRequestDispatcher("/somePage.jsp").forwardrequest, response); re ...
- Servlet API中forward()与redirect()的区别?
Servlet API中forward()与redirect()的区别? a.从地址栏显示来说 forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这 ...
- java中forward和redirect_java中转发forward和重定向redirect的区别
Forward(转发) 是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是 ...
- java中forward和redirect_好程序员Java教程分享:Forward和Redirect的区别
Java教程分享:Forward和Redirect的区别,用户向服务器发送了一次HTTP请求,该请求可能会经过多个信息资源处理以后才返回给用户,各个信息资源使用请求转发机制相互转发请求,但是用户是感觉 ...
- Java Web中Forward和redirect的区别
导读:Servlet有三种协作方案:Forward协作.Include协作.重定向协议(Redirect). include协作就是一个servlet包含了另一个servlet的全部内容 那么,For ...
最新文章
- AngularJS ng-if使用
- 图解web前端开发工具教程
- Oracle 11g系统自动收集统计信息
- 关于使用public class 和 class声明类的区别
- java如何关闭creo,creo怎么把网页关掉
- C#: using JsonReader avoid Deserialize Json to dynamic
- python里eval和input组合使用_python中eval()函数和input()函数用法解析
- 计算机附件中的超级终端,windows10系统中附件中没有超级终端怎么解决
- 杰理AC692X---691X,690X,692X芯片差异(2)
- 使用liteide开发go遇到的问题
- 一周小结(2019/12/23)
- 奇异谱分析(SSA)的matlab实现
- PS小知识(五)——羽化(图片拼接后去缝、自然过渡渐变)
- ProFTPD对接LDAP
- Python数据分析--统计注册用户
- python的return详解。
- C#常见容器ArrayList、List、HashSet、Hashtable 、Dictionary、Stack、Queue
- 《大数据架构和算法实现之路:电商系统的技术实战》——2.4 案例实践
- ORACLE12.2 RAC+DG(2+1) RU patch步骤
- 运行node时报错:events.js:167 throw er; // Unhandled 'error' event