Spring RedirectAttributes:addAttribute vs addFlashAttribute

我的理解到目前为止是在我们的控制器请求映射方法,我们可以指定RedirectAttributes参数,并填充与请求redirect时的属性,例如:

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

redirect属性将在redirect到的目标页面上可用。

不过,RedirectAttributes有两个方法:addAttribute和addFlashAttribute。 这两者之间的根本区别是什么,我该如何select使用哪一个呢? 一直在阅读春季手册文件一段时间,但我有点失落

addFlashAttribute实际上将属性存储在一个flashmap中(在用户session内部维护,一旦下一个redirect的请求得到满足,就将其删除),另一个addAttribute本质上构造请求参数,并使用请求参数redirect到所需的页面。 所以优点是你可以在你的flash属性中存储几乎任何对象(因为它不被序列化为请求参数,而是作为一个对象来维护),而使用addAttribute因为你添加的对象被转换为正常的请求参数,你是相当有限的对象types如string或基元。

假设您有两个控制器。如果您从一个控制器redirect到另一个控制器,那么模型对象中的值将不会在另一个控制器中可用。 所以如果你想分享模型对象值,那么你必须在第一个控制器中说

 addFlashAttribute("modelkey", "modelvalue"); 

那么第二个控制器的模型就包含了上面的键值对。

第二个问题? RedirectAttributes类中的addAttributeaddFlashAttribute什么区别

addAttribute将传递值作为requestparameters而不是模型,所以当你使用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"; } 

Javadoc描述: “一个FlashMap为一个请求提供了一个存储用于另一个请求的属性的方法,当从一个URLredirect到另一个URL时,这是最常用的,例如Post / Redirect / Get模式。redirect(通常在会话中)并在redirect后立即可用。“