当控制器方法返回的String值以“redirect:”开头的话,那么这个String不是用来查找视图的,而是用来指导浏览器进行重定向的路径。如:
有两种方案能从发起重定向的方法传递数据给处理重定向方法中:
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>