@SessionScoped是一个好习惯吗?

ped*_*t92 0 jsf session-scope scopes

我已经阅读了范围(@SessionScoped, @ViewScoped, @ApplicationScope and @RequestScope)类型之间的所有差异,但是,我仍然在某种程度上遇到应用程序问题。我有一个page-1 与网格和我所选择的项目发送到page-2(两者page-1page-2用相同的支持bean),以进行编辑,然后持续存在。据我所知,我的托管bean正在使用@RequestScopedjavax.faces.bean.RequestScoped这是理想的使用范围,但是它不起作用,bean被破坏了,数据丢失了。

恢复该故事,我将注释更改为@SessionScoped并且可以正常工作,但是我想知道这是否是一个好习惯?因为我已经读到,使用这种方法不是一个好习惯,@SessionScoped因为在客户端注销之前数据将一直保持活动状态。

Tar*_*rik 5

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

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

    Bean被破坏,数据丢失

  • ViewScoped:一旦导航到另一个页面(page-2针对您的情况),就会创建一个新bean

    注:新豆也将创造你每次使用一个返回值相同页面交互不同的voidnull

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

我强烈建议您查看以下问题:如何选择正确的bean作用域?其中提供了有关如何正确选择bean范围的详细说明。

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

  1. 当您在两个页面中使用相同的bean时,可以考虑使用一个JSF页面并使用rendered属性,然后可以将bean注释为@ViewScoped(在这种情况下,请不要忘记返回voidnull在bean的action方法中)。您可以在此处找到一些示例:@ViewScoped的好处和陷阱或者

  2. 您可以利用新的Flash作用域概念,可以在此处找到一个示例:了解JSF2中的Flash作用域或者

  3. 如果您的环境已经支持CDI(或者您可以简单地添加CDI支持),那么@ConversationScoped就您的情况而言,使用将是最佳选择,您可能会在这里找到一个很好的例子:JSF 2 ConversationScope如何工作?或者

  4. 按照Kukeltje的评论,您可以使用Apache DeltaSpike提供的@ViewAccessScoped@GroupedConversationScoped,这两种方法都比std更加灵活。。@ConversationScoped