我已阅读以下主题:
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";
}