【问题标题】:Confusion between addAttribute and addFlashAttribute in RedirectAttributes classRedirectAttributes 类中 addAttribute 和 addFlashAttribute 之间的混淆
【发布时间】:2015-11-21 11:04:02
【问题描述】:

我已阅读以下主题:

Spring RedirectAttributes: addAttribute vs addFlashAttribute

据我了解,flash属性和plain属性的主要区别在于plain属性只能保存Strings和primitives。

但在实践中我发现了另一个区别:

我有以下控制器方法:

....
redirectAttributes.addAttribute("error", messageSource.getMessage("AdminController.negativeSum", null, Locale.forLanguageTag("ru-RU")));
return "redirect:/admin/confirmWithdrawRequest";

@RequestMapping(value = "admin/confirmWithdrawRequest", method = RequestMethod.GET)
public String confirmWithdrawRequestShowPage(Model model) {
    Set<Event> cashOutEvents = eventJournalService.getEventsByType(EventType.CASHOUT_REQUEST);
    model.addAttribute("events", cashOutEvents);
    model.addAttribute("statuses", EventStatus.values());
    return "admin/confirmWithdrawRequest";
}

在页面confirmWithdrawRequest.jsp

我写了以下代码片段:

<c:choose>
    <c:when test="${not empty error}">
        <div class="errorblock">
               ${error}
        </div>
    </c:when>
</c:choose>

现在我在我的页面上看不到错误消息。

如果我将 redirectAttributes.addAttribute 替换为 redirectAttributes.addFlashAttribute - 将显示错误消息。

请解释这种行为并展示我应该使用 addAttribute 方法的场景。

【问题讨论】:

  • downwoter,请解释原因?
  • 你的理解不正确,addAttributeaddFlashAttribute 用途不同。您应该阅读文档的这两部分:Passing Data To the Redirect TargetUsing flash attributes
  • @Roman 是否重定向属性只是传递给 url 而没有添加到模型?
  • RedirectAttributes is Model (但它仅用于重定向的情况下),所以我不太明白这个问题。
  • 我在我相信的主题中给出了详细的描述

标签: java spring spring-mvc redirect


【解决方案1】:

正如 Spring 文档所述:

默认情况下,所有模型属性都被视为在重定向 URL 中作为 URI 模板变量公开。在剩余的属性中,那些是原始类型或原始类型的集合/数组的属性会自动附加为查询参数。

因此,如果您使用的是addAttribute,它只需将参数添加到您的 URI 中。在您的情况下,在第一个方法调用之后,将重定向到 URI:YOUR_HOST/admin/confirmWithdrawRequest?error=Sometext。在重定向之后,您的confirmWithdrawRequestShowPage 将被执行,并且错误参数将被绑定,但由于您没有存储它,因此 JSP 将无法使用它。

addFlashAttribute 的情况下,该属性不会添加到 URI 中,而是存储在会话中(在服务器内),并且它们在重定向后的第一次读取之前可用。

总而言之,您可以将addAttribute 视为发送给客户端的内容,然后您通过URI 将其取回,而addFlashAttributes 则仅存储在服务器上。

如果您希望通过addAttribute 添加的属性在重定向后可用,您只需更改一些代码,如下所示:

@RequestMapping(value = "admin/confirmWithdrawRequest", method = RequestMethod.GET)
public String confirmWithdrawRequestShowPage(@RequestParam(value = "error") String error, Model model) {
    Set<Event> cashOutEvents = eventJournalService.getEventsByType(EventType.CASHOUT_REQUEST);
    model.addAttribute("events", cashOutEvents);
    model.addAttribute("statuses", EventStatus.values());
    model.addAttribute("error", error);
    return "admin/confirmWithdrawRequest";
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-22
    • 2013-07-16
    • 1970-01-01
    • 2012-06-09
    • 2015-03-03
    • 2016-09-22
    • 2015-06-01
    • 2020-01-08
    相关资源
    最近更新 更多