SpringMVC跨重定向请求传递数据

    当控制器方法返回的String值以“redirect:”开头的话,那么这个String不是用来查找视图的,而是用来指导浏览器进行重定向的路径。如:


    当一个处理器方法完成之后,该方法所指定的模型数据将会复制到请求中,并作为请求中的属性,请求会转发(forward)到视图上进行渲染。因为控制器方法和视图所处理的是同一个请求,所以在转发的过程中,请求属性能够得以保存。而当控制器的结果是重定向的话,原始的请求就结束了,并且会发起一个新的GET请求。原始请求中所带有的模型数据也就随着请求一起消亡了。在新的请求属性中,没有任何的模型数据,这个请求必须要自己计算数据。

有两种方案能从发起重定向的方法传递数据给处理重定向方法中:
    1.使用URL模板以路径变量和/或查询参数的形式传递数据;
    2.通过flash属性发送数据。


1.通过URL模板进行重定向

通过Spring拼接路由是比较危险的,所以上面的重定向语句可以改成:

    username作为占位符填充到了URL模板中,而不是直接连接到重定向String中,所以username中所有的不安全字符都会进行转义。除此之外,模型中所有其他的原始类型值都可以添加到URL中作为查询参数。

    假设除了username以外,模型中还要包含新创建Spitter对象的id属性,那processRegistration()方法可以改写为如下的形式:

      模型中的spitterId属性没有匹配重定向URL中的任何占位符,所以它会自动以查询参数的形式附加到重定向URL上。
    如果username属性的值是habuma并且spitterId属性的值是42,那么结果得到的重定向URL路径将会是“/spitter/habuma?spitterId=42”。

2.使用flash属性

    Spring提供了将数据发送为flash属性(flash attribute)的功能。按照定义,flash属性会一直携带这些数据直到下一次请求,然后才会消失。

    Spring提供了通过RedirectAttributes设置flash属性的方法,这是Spring 3.1引入的Model的一个子接口。RedirectAttributes提供了Model的所有功能,除此之外,还有几个方法是用来设置flash属性的。RedirectAttributes提供了一组addFlashAttribute()方法来添加flash属性。

在这里调用了addFlashAttribute()方法,并将spitter作为key,Spitter对象作为值。另外,我们还可以不设置key参数,让key根据值的类型自行推断得出:

因为我们传递了一个Spitter对象给addFlashAttribute()方法,所以推断得到的key将会是spitter。

在重定向执行之前,所有的flash属性都会复制到会话中。在重定向后,存在会话中的flash属性会被取出,并从会话转移到模型之中。

    showSpitterProfile()方法所做的第一件事就是检查是否存有key为spitter的model属性。如果模型中包含spitter属性,那就什么都不用做了。这里面包含的Spitter对象将会传递到视图中进行渲染。但是如果模型中不包含spitter属性的话,那么showSpitterProfile()将会从Repository中查找Spitter,并将其存放到模型中。

localhost:8080/Text/aaa/s?userId=1&username=adfadsf&password=2222&loginStatus=1


没有传值

	@RequestMapping(value = "/s")
	public String lists(User user,RedirectAttributes redirect)
	{
		System.out.println(user.toString());
		redirect.addAttribute("id", user.getUserId());
		redirect.addFlashAttribute("text", user);
		return "redirect:/aaa/ls/{id}";
		//return "a";
	}
	
	@RequestMapping(value = "/ls/{id}")
	public String listss(@PathVariable Long id,Model model)
	{
		model.addAttribute("1",2);
		System.out.println(model.containsAttribute("1"));
		System.out.println(model.containsAttribute("2"));
		System.out.println(model.containsAttribute("text"));
		
		if(!model.containsAttribute("text")) {
			System.out.println(model.containsAttribute("text"));
		}
		return "a";
	}

使用addFlashAttributes


表示有值

页面输出为

<%@page contentType="text/html; charset=UTF-8" language="java" %>
<%@include file="common/tag.jsp" %>
<!DOCTYPE html>
<html>
<head>
    <title>1111</title>
    <%@include file="common/head.jsp" %>
</head>
<body>
<div>${text.password}</div>
<div>${text.userId}</div>
<div>${text.username}</div>
<div>${text.loginStatus}</div>
</body>
</html>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值