@SessionScoped 是一个好习惯吗? [复制]
Posted
技术标签:
【中文标题】@SessionScoped 是一个好习惯吗? [复制]【英文标题】:Is @SessionScoped a good practice? [duplicate] 【发布时间】:2015-05-08 09:55:13 【问题描述】:我已经阅读了范围类型之间的所有差异 (@SessionScoped, @ViewScoped, @ApplicationScope and @RequestScope
),但是,我的应用程序仍然存在某种问题。我有一个带有网格的page-1
,我将所选项目发送到page-2
(page-1
和page-2
都使用相同的支持bean)进行编辑然后持久化。我的托管 bean 使用来自javax.faces.bean.RequestScoped
的@RequestScoped
,因为我知道这是使用的理想范围,但它不起作用,bean 被破坏并且数据丢失了。
恢复故事,我已将注释更改为 @SessionScoped
并且它有效,但我想知道这是否是一个好习惯?因为我读过使用@SessionScoped
不是一个好习惯,因为数据将一直保持活动状态,直到客户端注销。
【问题讨论】:
简而言之,您提到的场景完全透明地依赖于业务需求,使用/选择的范围。 【参考方案1】:最佳实践是选择适当的 bean 范围(会话范围或另一个)。在您的情况下选择的 适当 范围是 @SessionScoped
bean,因为在以下情况下:
RequestScoped
:每个 HTTP 请求-响应周期后都会创建一个新的 bean,您在尝试请求范围时已经遇到过:
bean 被销毁,数据丢失
ViewScoped
:一旦您导航到另一个页面(在您的情况下为page-2
),将创建一个新bean
注意:每次您使用与void
或null
不同的返回值不同 与同一页面交互时,也会创建一个新bean。
@ApplicationScoped
:在该示例中根本没有任何意义(仅当您想在所有用户之间共享数据/状态时才使用它)
我强烈建议您查看此 Q/A:How to choose the right bean scope?,它提供了有关如何正确选择 bean 范围的详细说明。
可以考虑其他建议,这取决于您的功能要求和/或应用环境:
-
1234563不要忘记在您的 bean 的操作方法中返回
void
或 null
)。您可以在这里找到一些示例: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 是一个好习惯吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章