【问题标题】:which bean should I keep in which scope我应该将哪个 bean 保留在哪个范围内
【发布时间】:2013-02-14 16:17:41
【问题描述】:

我想要的在下面实现,我将有三个页面。

userList.xhtml:这将有一个数据表中的用户列表。点击用户后,我将在下一页(detailsOfUser.xhtml)中看到各个用户的详细信息

detailsOfUser.xhtml:此页面将包含在上述页面中被点击的用户的详细信息。在此页面上,我将有一个 Edit 按钮,单击该按钮后,我将在下一页的文本字段中获得相同的值(editUserDetails.xhtml)

editUserDetails.xhtml:包含上一页用户详细信息的文本字段。在此页面上,我将拥有Save 按钮,单击该按钮后我将重定向回detailsOfUser.xhtml,在那里我将看到相应用户更新的值。

我应该如何为这些 bean 使用 bean 和范围?

我应该对所有三个页面使用一个 bean,还是应该对不同范围的三个 bean 使用?

【问题讨论】:

  • 典型的经验法则:尽可能选择最窄的范围。我的理解(简短)是:将@RequestScoped 用于简单的输入/输出数据(不会使用ajax,例如显示额外的细节),@ViewScoped 用于在使用ajax 或回发到当前视图时保存数据(因此,进行修改等),因此,避免不必要的 bean 重新实例化,@SessionScoped 用于保存固有地属于用户(会话)的数据,例如用户本人、他的偏好、他在站点上所做的选择(他查看的用户等)。 )。

标签: java jsf jsf-2 scope javabeans


【解决方案1】:

UserListBean 可以是 RequestScoped 或 ViewScoped(CDI 中的 ConversationalScoped),取决于您是否要对表执行一些操作(即排序、过滤等)

UserDetailBean 将是 RequestScoped,因为您只需要查看详细信息即可。

EditUserDetailBean 再次是 RequestScoped,因为您不需要在请求期间维护任何数据

或者您也可以制作一个 SessionScoped bean 并将所有内容都放在那里,但我真的不推荐这样做,您不希望 session 太大。

所以更一般地说 - 请求期间不需要维护任何数据的页面的请求范围,当您需要存储有关页面上正在发生的事情的数据时查看范围(例如数据表过滤),会话范围存储会话范围的数据,例如登录的用户或购物车,最后是用于存储应用范围内容的应用范围(例如配置,它用作 Singleton bean)。

另请参阅 BalusC 的 this 文章,他很好地描述了这一切。

【讨论】:

  • 但是当我使用 redirect-faces=true 时,我不会在下一页中获取数据...如果我不使用 redirect-faces=true,在 URL 地址中我会获取上一页 URL。
  • 什么时候用什么?在任何地方使用<h:link /> 来访问页面,那么你就不需要faces-redirect 来更新url
  • 当我使用 h:commandLink。但是使用 h:link,我可以将 id 传递到下一页吗?
【解决方案2】:

我将为 userList.xhtml 制作一个 bean(可能是 ViewScope)。如果您的应用程序很小并且您喜欢简单,那么您也可以考虑制作这个 SessionScope。

对于 detailsOfUser.xhtmleditUserDetails.xhtml 我将使用另一个 bean,它必须是 ConversationScoped 或者如果您可以选择使用 MyFaces CODI(其中我强烈推荐),你可以给他们 ViewAccessScope 这就像一个自动对话范围。

这将使您以简单而正确的方式编写它。我了解到您在 detailsOfUser.xhtmleditUserDetails.xhtml 之间共享信息。

额外信息 - ViewScope 存在问题,您可能需要SeamMyFaces CODI 才能使其正常工作。

【讨论】:

  • 他应该实际使用CDI,这是推荐的方法
  • Seam 和 CODI 只是 Java EE 对 CDI 的扩展。事实上,CDI 的目的是让扩展成为可能。谁推荐的?
【解决方案3】:

我更喜欢使用 Viewscope 甚至 Requestscope,因为您不需要较长时间的数据。您只需要它来查看并通过单个 xhtml-Files 传递它。
所以我更喜欢一个带有 Viewscope 的 Bean。

【讨论】:

  • 但是当我使用 redirect-faces=true 时,我不会在下一页中获取数据...如果我不使用 redirect-faces=true,在 URL 地址中我会获取上一页 URL。
  • 这是通过将范围扩展到例如 - 带有 CODI 的 ViewAccessScope 或带有 CDI 的 ConversationScope 来解决的。
猜你喜欢
  • 1970-01-01
  • 2012-11-16
  • 2017-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-14
相关资源
最近更新 更多