欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

SpringMVC 重新定向redirect请求中携带数据方式

程序员文章站 2022-03-13 19:28:47
目录springmvc 重新定向redirect请求中携带数据使用url模版重定向使用flash属性springmvc 几种重定向携带数据方法1.拼接字符串2.采用redirectattribute来...

springmvc 重新定向redirect请求中携带数据

  • 在控制器方法返回的视图名称中使用了redirect:前缀,这时返回的string不是用来寻找视图,而是浏览器进行跳转的路径:
return “redirect:/spitter/” + spitter.getusername();

当一个控制器返回的是一个redirect时,原来的request会终止,并且会开启一个新的http请求。原来request中所有的model数据都会清空。新的request不会有任何的model数据,如图:

SpringMVC 重新定向redirect请求中携带数据方式

现在不能再redirect时使用model来传递数据了。但是还有其他方法用来从重定向的方法中获取数据:

  • 将数据转换为路径参数或者查询参数
  • 在flash属性中发送数据首先来看一下spring如何在路径参数或者查询参数中传递数据。

使用url模版重定向

@requestmapping(value="/register", method=post)
public string processregistration(spitter spitter, model model) {
    spitterrepository.save(spitter);
    model.addattribute("username", spitter.getusername());
    return "redirect:/spitter/{username}";
}
@requestmapping(value = "/{username}", method = requestmethod.get)
    public string showspitterprofile(@pathvariable string username, model model) {
        system.out.println("showspitterprofile");
        spitter spitter = spittlerepository.findbyusername(username);
        model.addattribute(spitter);
        return "profile";
    }

model中其他的原始值也会作为查询参数添加到重定向url中。例如,除了username,model同时也包括新建的spitter对象的id属性:

@requestmapping(value="/register", method=post)
public string processregistration(spitter spitter, model model) {
    spitterrepository.save(spitter);
    model.addattribute("username", spitter.getusername());
    model.addattribute("spitterid", spitter.getid());
    return "redirect:/spitter/{username}";
}

但是由于model中的spitterid属性并没有映射到url中的占位符,它会自动作为查询参数。

如果username是habuma,spitterid是42,那么返回的重定向路径将是/spitter/habuma?spitterid=42。

使用flash属性

spring提供了通过redirectattributes来设置flash属性,redirectattributes作为model的子接口,新增了一些方法用来设置flash属性。

@requestmapping(value="/register", method=post)
public string processregistration(spitter spitter, redirectattributes model) {
    spitterrepository.save(spitter);
    model.addattribute("username", spitter.getusername());
    model.addflashattribute("spitter", spitter);
    return "redirect:/spitter/{username}";
}

在重定向执行之前,所有的flash属性都会复制到会话中。在重定向后,存在会话中的flash属性会被取出,并从会话转移到模型之中。处理重定向的方法就能从模型中访问spitter对象了,就像获取其他的模型对象一样

SpringMVC 重新定向redirect请求中携带数据方式

@requestmapping(value = "/{username}", method = requestmethod.get)
public string showspitterprofile(@pathvariable("username") string username, model model) {
    if (!model.containsattribute("spitter")) {
        spitter spitter = spitterrepository.findbyusername(username);
        model.addattribute(spitter);
    }
    return "profile";
}

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

重新定向显示数据

....
....
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
....
....
username:<c:out value="${spitter.username}"/><br/>
firstname:<c:out value="${spitter.firstname}"/>
lastname: <c:out value="${spitter.lastname}"/><br/>
email:<c:out value="${spitter.email}"/>
....

springmvc 几种重定向携带数据方法

1.拼接字符串

return "redirect:/page/second?param1=lay&param2=lay2";

2.采用redirectattribute来传参数

public string first(redirectattribute redirectattribute){
    redirectattribute.addattribute("param1", "lay");
    return "redirect:/page/second";
}

3.redirectattribute—–addflashattribute()的用法

@controller
@requestmapping("/page")
public class redirectdemo{
    @requestmapping("/first")
    public string first(redirectattribute redirectattribute){
        redirectattribute.addflashattibute("param1", "lay");
        return "redirect:/page/second";
    }
    @requestmapping("/second")
    public string second(@modelattribute("param1") string param1){
        system.out.println(param1);
        return "second";
    }
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。