Spring 重定向属性: addAttribute() vs addFlashAttribute()

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

例子 :

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


// ...


return "redirect:/somewhere";
}

然后,重定向属性将可以在其重定向到的目标页上使用。

然而,重定向属性类有两个方法:

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

80850 次浏览

Here is the difference:

  • addFlashAttribute() actually stores the attributes in a flashmap (which is internally maintained in the users session and removed once the next redirected request gets fulfilled)

  • addAttribute() essentially constructs request parameters out of your attributes and redirects to the desired page with the request parameters.

So the advantage of addFlashAttribute() will be that you can store pretty much any object in your flash attribute (as it is not serialized into request params at all, but maintained as an object), whereas with addAttribute() since the object that you add gets transformed to a normal request param, you are pretty limited to the object types like String or primitives.

Javadoc description: "A FlashMap provides a way for one request to store attributes intended for use in another. This is most commonly needed when redirecting from one URL to another -- e.g. the Post/Redirect/Get pattern. A FlashMap is saved before the redirect (typically in the session) and is made available after the redirect and removed immediately."

Assume you have 2 controllers.If you redirect from one controller to another controller the values in model object won't be available in the other controller. So if you want to share the model object values then you have to say in first controller

addFlashAttribute("modelkey", "modelvalue");

Then second controller's model contains now the above key value pair..

Second question ? What is difference between addAttribute and addFlashAttribute in RedirectAttributes class

addAttribute will pass the values as requestparameters instead of model,so when you add some using addAttribute you can access those values from request.getParameter

Here is the code.I have used to find out what is going on :

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