![](/img/trans.png)
[英]Spring RedirectAttributes: addAttribute() vs addFlashAttribute()
[英]Confusion between addAttribute and addFlashAttribute in RedirectAttributes class
我已閱讀以下主題:
Spring RedirectAttributes:addAttribute與addFlashAttribute
據我了解,flash屬性和Plain屬性之間的主要區別在於,plain屬性只能保存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";
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.