83

到目前为止,我的理解是关于我们的控制器请求映射方法,我们可以指定RedirectAttributes参数并在请求被重定向时使用属性填充它。

示例

@RequestMapping(value="/hello", method=GET)
public String hello(RedirectAttributes redirAttr)
{
   // should I use redirAttr.addAttribute() or redirAttr.addFlashAttribute() here ?

   // ...

   return "redirect:/somewhere";
}

然后重定向属性将在它重定向到的目标页面上可用。

但是RedirectAttributes类有两种方法:

已经阅读 Spring 文档有一段时间了,但我有点迷茫。这两者之间的根本区别是什么,我应该如何选择使用哪一个?

4

3 回答 3

115

这是区别

  • addFlashAttribute()实际上将属性存储在flashmap 中(在用户内部维护session并在下一个重定向请求得到满足时将其删除)

  • addAttribute()本质上是根据您的属性构造请求参数,并使用请求参数重定向到所需的页面。

因此,这样做的好处addFlashAttribute()您可以在flash 属性中存储几乎任何对象(因为它根本没有序列化为请求参数,而是作为对象维护),而addAttribute()由于您添加的对象被转换为普通对象请求参数,您仅限于对象类型,如String或原语。

于 2013-01-23T01:03:35.380 回答
18

假设您有 2 个控制器。如果您从一个控制器重定向到另一个控制器,则模型对象中的值在另一个控制器中将不可用。因此,如果您想共享模型对象值,那么您必须在第一个控制器中说

addFlashAttribute("modelkey", "modelvalue");

然后第二个控制器的模型现在包含上面的键值对..

第二个问题?addAttribute课堂和课堂addFlashAttribute有什么区别RedirectAttributes

addAttribute将值作为请求参数而不是模型传递,因此当您添加一些使用时,addAttribute您可以从request.getParameter

这是代码。我用来找出发生了什么:

@RequestMapping(value = "/rm1", method = RequestMethod.POST)
public String rm1(Model model,RedirectAttributes rm) {
    System.out.println("Entered rm1 method ");

    rm.addFlashAttribute("modelkey", "modelvalue");
    rm.addAttribute("nonflash", "nonflashvalue");
    model.addAttribute("modelkey", "modelvalue");

    return "redirect:/rm2.htm";
}


@RequestMapping(value = "/rm2", method = RequestMethod.GET)
public String rm2(Model model,HttpServletRequest request) {
    System.out.println("Entered rm2 method ");

    Map md = model.asMap();
    for (Object modelKey : md.keySet()) {
        Object modelValue = md.get(modelKey);
        System.out.println(modelKey + " -- " + modelValue);
    }

    System.out.println("=== Request data ===");

    java.util.Enumeration<String> reqEnum = request.getParameterNames();
    while (reqEnum.hasMoreElements()) {
        String s = reqEnum.nextElement();
        System.out.println(s);
        System.out.println("==" + request.getParameter(s));
    }

    return "controller2output";
}
于 2015-05-31T17:31:08.063 回答
7

Javadoc 描述: “FlashMap 为一个请求提供了一种方法来存储打算在另一个 URL 中使用的属性。这在从一个 URL 重定向到另一个 URL 时最常用——例如 Post/Redirect/Get 模式。FlashMap 在重定向(通常在会话中)并在重定向后可用并立即删除。”

于 2014-01-11T19:56:12.417 回答