@SessionScoped 是一个好习惯吗? [复制]

Posted

技术标签:

【中文标题】@SessionScoped 是一个好习惯吗? [复制]【英文标题】:Is @SessionScoped a good practice? [duplicate] 【发布时间】:2015-05-08 09:55:13 【问题描述】:

我已经阅读了范围类型之间的所有差异 (@SessionScoped, @ViewScoped, @ApplicationScope and @RequestScope),但是,我的应用程序仍然存在某种问题。我有一个带有网格的page-1,我将所选项目发送到page-2page-1page-2 都使用相同的支持bean)进行编辑然后持久化。我的托管 bean 使用来自javax.faces.bean.RequestScoped@RequestScoped,因为我知道这是使用的理想范围,但它不起作用,bean 被破坏并且数据丢失了。

恢复故事,我已将注释更改为 @SessionScoped 并且它有效,但我想知道这是否是一个好习惯?因为我读过使用@SessionScoped 不是一个好习惯,因为数据将一直保持活动状态,直到客户端注销。

【问题讨论】:

简而言之,您提到的场景完全透明地依赖于业务需求,使用/选择的范围。 【参考方案1】:

最佳实践是选择适当的 bean 范围(会话范围或另一个)。在您的情况下选择的 适当 范围是 @SessionScoped bean,因为在以下情况下:

RequestScoped:每个 HTTP 请求-响应周期后都会创建一个新的 bean,您在尝试请求范围时已经遇到过:

bean 被销毁,数据丢失

ViewScoped:一旦您导航到另一个页面(在您的情况下为page-2),将创建一个新bean

注意:每次您使用与voidnull 不同的返回值不同 与同一页面交互时,也会创建一个新bean。

@ApplicationScoped:在该示例中根本没有任何意义(仅当您想在所有用户之间共享数据/状态时才使用它)

我强烈建议您查看此 Q/A:How to choose the right bean scope?,它提供了有关如何正确选择 bean 范围的详细说明。

可以考虑其他建议,这取决于您的功能要求和/或应用环境:

    1234563不要忘记在您的 bean 的操作方法中返回 voidnull)。您可以在这里找到一些示例:The benefits and pitfalls of @ViewScoped。 或者

    您可以使用新的Flash scope 概念,可以在此处找到示例:Understand Flash Scope in JSF2。 或者

    如果您的环境已经支持 CDI(或者您可以简单地添加 CDI 支持),那么根据您的情况使用 @ConversationScoped 将是最佳选择,您可以在此处找到一个很好的示例:How does JSF 2 ConversationScope work?。 或者

    根据 Kukeltje 的评论,您可以使用Apache DeltaSpike 提供的@ViewAccessScoped@GroupedConversationScoped,它们都比标准更灵活。 @ConversationScoped

【讨论】:

我不想直接编辑您的回复,但我认为在这些情况下最好的范围是 DeltaSpike 中的@ViewAccessScoped。它比 SessionScoped 短,比 ViewScoped 长,与 ConversationScoped 相比,它是“自动”维护的 @Kukeltje 感谢您提供的信息,但我回答了,因为 OP 似乎只谈论 JSF 范围,而没有提及 CDI 支持或任何其他库。因此,由于我们现在并不知道他工作的确切环境,我首先建议选择合适的 bean(以防他只能使用 JSF 范围),然后我提供了其他建议以防他不依赖 JSF 范围只要。因此,如果他想使用外部库,使用@ViewAccessScoped 对我来说是一个额外的建议(顺便说一句,我对该范围并不陌生,很高兴了解其他信息) @Kukeltje 更新了您的建议 你说得对,jsf 和 cdi 的作用域存在差异,但由于 jsf 的作用域应该被视为已弃用,我认为我们应该始终提及 cdi 的作用域。顺便说一句,增量峰值有更多有趣的东西。就像 OmniFaces 一样,没有它你就不能工作 ;-) @Kukeltje 是的,它包含非常有趣的模块,我仍然坚持他们的文档页面

以上是关于@SessionScoped 是一个好习惯吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

扩展 Struts 框架 FilterDispatcher 会是一个好习惯吗?

JQuery 命名空间是一个好习惯吗?

使用多个是一个好习惯吗

忽略脚本类型是一个好习惯吗? [复制]

jQuery 插件 - 这是一个好习惯吗?

为 CQRS 实施包装 Masstransit 是一个好习惯吗? [关闭]