我已阅读以下主题:
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方法的方案。
答案 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";
}