gpt4 book ai didi

java - RedirectAttributes 类中 addAttribute 和 addFlashAttribute 之间的混淆

转载 作者:行者123 更新时间:2023-11-30 03:09:48 35 4
gpt4 key购买 nike

我已阅读以下主题:

Spring RedirectAttributes: addAttribute vs addFlashAttribute

据我了解,flash 属性和普通属性之间的主要区别在于普通属性只能保存 String 和基元。

但在实践中我发现了另一个区别:

我有以下 Controller 方法:

....
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 文档所述:

By default all model attributes are considered to be exposed as URI template variables in the redirect URL. Of the remaining attributes those that are primitive types or collections/arrays of primitive types are automatically appended as query parameters.

因此,如果您使用 addAttribute,它只会将参数添加到您的 URI 中。在您的情况下,第一个方法调用后,将重定向到 URI:YOUR_HOST/admin/confirmWithdrawRequest?error=Sometext。重定向后,您的 confirmWithdrawRequestShowPage 将被执行,并且错误参数将被绑定(bind),但由于您没有存储它,因此 JSP 将无法使用它。

对于 addFlashAttribute,该属性不会添加到 URI 中,而是存储在 session 中(在服务器内),并且它们在重定向后第一次读取之前一直可用。

总而言之,您可以将 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";
}

关于java - RedirectAttributes 类中 addAttribute 和 addFlashAttribute 之间的混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33842546/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com