Spring RedirectAttributes: addAttribute vs addFlashAttribute

My understanding so far is on our controller request mapping method we can specify RedirectAttributes parameter and populate it with attributes for when the request get redirected, eg:

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

   // ...

   return "redirect:/somewhere";
}

The redirect attributes will then be available on the target page where it redirects to.
However RedirectAttributes have two methods: addAttribute & addFlashAttribute. What is the fundamental differences between those two, and how should I choose which one to use? Have been reading spring manual doc for a while but I’m a bit lost

·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), on the other addAttribute essentially constructs request parameters out of your attributes and redirects to the desired page with the request parameters. So the advantage 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";
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值