Jsf @sessionscope是一种好的实践吗?

Jsf @sessionscope是一种好的实践吗?,jsf,scopes,session-scope,Jsf,Scopes,Session Scope,我已经了解了作用域类型之间的所有差异(@SessionScoped、@viewscope、@ApplicationScope和@RequestScope),但是,我的应用程序仍然面临着某种问题。我有一个带有网格的page-1,我将所选项目发送到page-2(page-1和page-2都使用相同的支持bean)进行编辑,然后保存。我的托管bean使用的是javax.faces.bean.RequestScoped中的@RequestScoped,据我所知,它是理想的使用范围,但它不起作用,bean

我已经了解了作用域类型之间的所有差异(
@SessionScoped、@viewscope、@ApplicationScope和@RequestScope
),但是,我的应用程序仍然面临着某种问题。我有一个带有网格的
page-1
,我将所选项目发送到
page-2
page-1
page-2
都使用相同的支持bean)进行编辑,然后保存。我的托管bean使用的是
javax.faces.bean.RequestScoped
中的
@RequestScoped
,据我所知,它是理想的使用范围,但它不起作用,bean被破坏,数据丢失


继续讲这个故事,我已经将注释更改为
@SessionScoped
,它起了作用,但我想知道这是否是一个好的做法?因为我已经读到使用
@SessionScoped
不是一个好的做法,因为在客户端注销之前,数据将保持活动状态

最佳实践是选择适当的bean范围(会话范围或其他范围)。在您的案例中要选择的合适的范围是
@SessionScoped
bean,因为在以下情况下:

  • RequestScoped
    :在每个HTTP请求-响应周期之后将创建一个新bean,您在尝试请求范围时已经遇到了这个问题:

    bean正在被销毁,数据正在丢失

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

    NB:每次您使用与
    void
    null
    不同的返回值与同一页面交互时,也将创建一个新bean

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

我强烈建议您看看这个Q/a:它提供了关于如何正确选择bean范围的详细解释

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

  • 当您在两个页面中使用同一个bean时,您可以考虑使用一个JSF页面并使用
    呈现的
    属性,然后您可以将bean注释为
    @ViewScoped
    (在这种情况下,不要忘了在bean的操作方法中返回
    void
    null
    )。您可以在此处找到一些示例:

  • 您可以利用这个新概念,这里可以找到一个示例:

  • 如果您的环境已经支持CDI(或者您可以简单地添加CDI支持),那么就您的情况而言,使用将是最佳选择,您可以在这里找到一个很好的示例:

  • 在Kukeltje的评论之后,您可以使用提供的or,两者都比std.
    @ConversationScoped
    更灵活


  • 最佳实践是选择适当的bean范围(会话范围或其他范围)。在您的案例中要选择的合适的范围是
    @SessionScoped
    bean,因为在以下情况下:

    • RequestScoped
      :在每个HTTP请求-响应周期之后将创建一个新bean,您在尝试请求范围时已经遇到了这个问题:

      bean正在被销毁,数据正在丢失

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

      NB:每次您使用与
      void
      null
      不同的返回值与同一页面交互时,也将创建一个新bean

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

    我强烈建议您看看这个Q/a:它提供了关于如何正确选择bean范围的详细解释

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

  • 当您在两个页面中使用同一个bean时,您可以考虑使用一个JSF页面并使用
    呈现的
    属性,然后您可以将bean注释为
    @ViewScoped
    (在这种情况下,不要忘了在bean的操作方法中返回
    void
    null
    )。您可以在此处找到一些示例:

  • 您可以利用这个新概念,这里可以找到一个示例:

  • 如果您的环境已经支持CDI(或者您可以简单地添加CDI支持),那么就您的情况而言,使用将是最佳选择,您可以在这里找到一个很好的示例:

  • 在Kukeltje的评论之后,您可以使用提供的or,两者都比std.
    @ConversationScoped
    更灵活


  • 我不想直接编辑您的回复,但我认为在这些情况下,最好的范围是在DeltaSpike中提供。它比SessionScoped短,比ViewScoped长,与ConversationScoped相比,它是“自动的”maintained@Kukeltje感谢您提供的信息,但我的回答是这样的,因为OP似乎只讨论JSF范围,而没有提到CDI支持或任何其他库。因此,由于我们现在不知道他所处的确切环境,我首先建议选择合适的bean(如果他必须只使用JSF作用域),然后我提供了额外的建议,以防他不仅仅依赖JSF作用域。因此,如果他想使用外部库,使用
    @viewAccessScope
    对我来说是一个额外的建议