Spring RedirectAttributes:addAttribute()vs addFlashAttribute()

时间:2013-01-22 23:46:17

标签: java spring spring-mvc

到目前为止,我的理解是在我们的控制器请求映射方法中,我们可以指定 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文档,但我有点迷失了。这两者之间的基本差异是什么,我该如何选择使用哪一个?

3 个答案:

答案 0 :(得分:88)

以下是差异

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

  • addAttribute()基本上构建请求参数 您的属性并使用请求重定向到所需的页面 参数。

addFlashAttribute()优势将是您可以在 flash属性中存储几乎任何对象(因为它未被序列化为请求参数所有,但保持为对象),而对于addAttribute(),因为您添加的对象被转换为普通的请求参数,您只能局限于String或基元等对象类型。

答案 1 :(得分:14)

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

addFlashAttribute("modelkey", "modelvalue");

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

第二个问题? addAttribute

中的addFlashAttributeRedirectAttributes之间有何区别?

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";
}

答案 2 :(得分:7)

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