哪个bean应该保留在哪个范围内

时间:2013-02-28 12:56:17

标签: java jsf jsf-2 scope javabeans

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

userList.xhtml :这将包含dataTable中的用户列表。点击用户,我将在下一页中看到相应用户的详细信息(detailsOfUser.xhtml)

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

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

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

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

3 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

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

或者您也可以创建一个SessionScoped bean并将所有内容放在那里,但我不建议这样做,您不希望会话太大。

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

另见BalusC的this文章,他很好地描述了它的全部内容。