簡體   English   中英

RedirectAttributes類中的addAttribute和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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM