RedirectAttributes类中addAttribute和addFlashAttribute之间的混淆

时间:2015-11-21 11:04:03

标签: java spring spring-mvc redirect

我已阅读以下主题:

Spring RedirectAttributes: addAttribute vs addFlashAttribute

据我了解,flash属性和普通属性的主要区别在于普通属性只能保存String和原语。

但在实践中我看到了另一个不同之处:

我有以下控制器方法:

....
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方法的方案。

1 个答案:

答案 0 :(得分:2)

正如Spring Documentation所述:

  

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

因此,如果您使用的是addAttribute,则只需将参数添加到您的URI中即可。在第一个方法调用之后的情况下,将会重定向到URI:YOUR_HOST/admin/confirmWithdrawRequest?error=Sometext。在重定向之后,您的confirmWithdrawRequestShowPage将被执行,并且error参数将被绑定,但是当您不存储它时,它将无法用于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";
}