我已阅读以下主题:

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方法时的情况。

最佳答案

如Spring文档所述:


  默认情况下,所有模型属性均被视为在重定向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";
}

10-06 12:38