当前位置: 首页 > 知识库问答 >
问题:

重定向属性类中addAtort和addFlashAtort之间的混淆

宁良平
2023-03-14

我阅读了以下主题:

Spring重定向属性:addAttribute vs addFlashAttribute

据我所知,flash属性和普通属性之间的主要区别在于普通属性只能保存Strings和原语。

但在实践中,我看到了另一个区别:

我有以下控制器方法:

....
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";
}

在“ConfirmDrawRequest”页面上。jsp

我编写了以下代码片段:

<c:choose>
    <c:when test="${not empty error}">
        <div class="errorblock">
               ${error}
        </div>
    </c:when>
</c:choose>

现在我在页面上看不到错误消息。

如果我替换重定向属性(redirectAttributes)。使用重定向属性(redirectAttributes)添加属性(addAttribute)。addFlashAttribute-将显示错误消息。

请解释这种行为,并给出我应该使用addAttribute方法的场景。

共有1个答案

宓昂雄
2023-03-14

正如Spring文档所述:

默认情况下,所有模型属性都被视为在重定向URL中作为URI模板变量公开。在其余的属性中,属于基元类型或基元类型集合/数组的属性将自动附加为查询参数。

因此,如果您使用的是addAttribute,它只会将参数添加到您的URI中。在您的情况下,在第一个方法调用之后,将重定向到URI:your\u HOST/admin/confirm取款请求?错误=某些文本。重定向后,将执行confirmDrawRequestShowPage,错误参数将绑定,但由于您没有存储它,JSP将无法使用它。

在addFlashAttribute的情况下,该属性不会添加到URI中,而是存储在会话中(在服务器内),并且在重定向后的第一次读取之前可用。

综上所述,您可以将add属性视为发送到客户端的东西,然后您通过URI将其取回,而addFlash属性则视为仅存储在服务器上的东西。

如果希望通过添加属性(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";
}
 类似资料:
  • 我不想使用flash属性。 有可能吗?

  • 问题内容: 有谁知道Http servlet中转发和重定向之间的区别以及这些区别对浏览器刷新的影响? 问题答案: 转发 是在不通知客户端的情况下完成的,它用于在服务器上进行内部通信,而在 重定向时, 我们要求客户端返回并在此处进行询问。 转寄 您去了邮局,那里有很多箱子和人坐在那里,现在其中一个人接受了您的请求,并且内部将其转发给其他负责人来满足您的请求,在流程结束时,您将得到结果 重新导向 现在

  • 问题内容: res.location()方法的用途是什么?我可以使用res.redirect()重定向到特定的URL,如果在res.redirect()之前使用res.location(),则看不到任何更改。 问题答案: 它们的描述非常相似,但功能更多。看到差异的最简单方法是查看源代码。 只需设置响应头即可。它不会设置响应状态代码或关闭响应,因此您可以根据需要编写响应正文,然后必须自己调用。 另一

  • 问题内容: 我研究猫鼬已经三天了,对这两种方法的使用我有点困惑(我知道将来会不推荐使用“ mongoose.connection()” …) 问题是:当我尝试转换(从“ mongoose.connection()”到“ mongoose.createConnection()”)此示例的action.js文件https://gist.github.com/2785463时,不为我工作… 有我的代码…

  • 问题内容: 对于“属性”和“属性”之间的区别,我通常感到困惑,并且找不到很好的资源来简洁地详细说明这些区别。 问题答案: 属性是一种特殊的属性。基本上,当Python遇到以下代码时: 它查找中,然后检查,看它是否有一个,或方法- 如果这样做,这是一个性质。如果它 是 一个属性,则不仅会返回该对象(就像对其他任何属性一样),还会调用该方法(因为我们一直在进行查找),并返回该方法返回的内容。 有关Py

  • 本文向大家介绍综合属性和继承属性之间的区别,包括了综合属性和继承属性之间的区别的使用技巧和注意事项,需要的朋友参考一下 合成属性和继承属性都是语言语义的一部分,该语言为其构造提供含义,例如标记和语法结构。语义有助于解释符号,符号的类型及其相互之间的关系,其分析可判断源程序中构造的语法结构是否衍生出任何含义。现在,基于属性的特征,我们可以区分综合属性和继承属性 以下是合成属性和继承属性之间的重要区别