JSF CDI:Conversation作用域的bean最佳实践

11

我目前正在学习JSF 2.0,并且很高兴有这个会话范围功能的存在,它非常有帮助,可以在同一页上打开新标签页或新窗口,并具有独立的资源,不会互相覆盖。

但我很好奇如何以良好的方式实现这一点,何时开始对话,何时结束对话。

在我的情况下,我为每个JSF页面拥有一个CDI bean。假设我有一个菜单,当点击它时,会导致页面A,从A可能会导致B,B可能会导致C,C可能会导致D,所有这4个页面都连接在一条链中。

可以从B或C或D bean访问A的bean属性,也可以从C或D bean访问B的属性,依此类推。

现在我很困惑:

  • 所有这些ABCD应该使用会话范围还是不使用会话范围,或者仅使用A?因为我认为有时来自ABCDF之外的另一页,比如页面F,它也可以导航到页面B,尽管我还不知道如何向bean B提供数据。
  • 是否应将所有这些ABCD组合成一个bean
  • 何时在哪里开始对话,我考虑使用构造函数,但我不认为这是一个好主意,因为我更喜欢在第一次访问页面而不是bean时开始对话
  • 何时在哪里结束对话,以防止无用的资源挂起

请分享您对此的想法。


3
CDI不是JSF的标准部分。CDI代表上下文和依赖注入(JSR-299),它涵盖了javax.enterprise包中的注释。谈话范围也不是标准JSF的一部分。它是JBoss Seam在JSF 1.2时代发明的,并被JSF 2.0规范采纳为视图范围,可以通过@ViewScoped注释进行切换。现在,你实际上在谈论什么? - BalusC
你好BalusC,感谢澄清。我使用CDI这个术语只是为了明确我正在使用什么,但也许这些信息与我的问题无关,抱歉 :) 据我所知,@ViewScoped用于单个页面的重新显示,并且属性将被持久化。但我想从对话范围中实现的是,我可以在多个选项卡上打开相同的页面,每个选项卡都像拥有自己的会话范围一样。因此,在选项卡上提交值'albert'到myBean.name不会覆盖其他选项卡上的myBean.name。但我对何时开始和结束对话感到困惑。 - Bertie
如果有4个页面,例如,页面A是浏览页面,用户可以搜索,页面B是详细页面,用户可以修改详细信息,页面C是用户可以修改子详细信息等等,这对我来说会更加令人困惑。如果我想要能够在多个选项卡中打开页面A而不会影响其他选项卡,则必须在A的bean上使用conversation scope。但我想B、C和D也应该使用conversation scope吧?还有关于何时何地开始/结束对话的问题。我的意思是,用户可以打开新选项卡并关闭选项卡。我如何检测并关闭对话? - Bertie
Albert,在回复不属于评论者自己的帖子中的评论时,请使用 @nickname,例如 @BalusC,以便自动通知他们有关评论回复的内容。请参见 http://meta.stackexchange.com/questions/43019/how-do-comment-replies-work - BalusC
1个回答

11

JSF 2提供了Request、View、Session和Application作用域。CDI引入了Conversation作用域,但更重要的是,它引入了一个标准,使新的作用域可以添加到平台上。

您描述的作用域可能更适合使用自定义作用域,例如window作用域。实现此作用域的两个项目是:

  1. Apache MyFaces CODI
  2. IceFaces有一个JSF(非CDI)Window作用域实现

尽管如此,我还是鼓励您重新考虑一下bean结构。我自己已经非常喜欢View作用域,结合JSF 2视图参数将信息从一个页面传递到另一个页面(以及从一个View作用域实例传递到另一个实例)。

MyFaces "View Access"作用域似乎是另一种不错的方法,其中一个bean只要被导航的页面保持对该作用域的引用,就会一直保持在作用域中。


谢谢!我一直在考虑视图作用域,它也可以在多标签或多窗口环境中使用。你所说的从一个视图作用域传递视图参数到另一个视图作用域,是通过h:button和嵌套的f:param实现的,并且与嵌套的f:viewParam一起使用f:metadata,我理解得对吗?如果我没记错,h:button将导致GET请求,这对我来说是个问题,因为有时,例如从页面B(POST)按删除键会返回到页面A的导航。在这种情况下,有没有办法将视图参数从B发送到A? - Bertie
您可以在导航规则中添加字符串"?includeViewParams=true",这样“着陆页面”上定义的视图参数将自动包含在其中。 - Brian Leathem
好的,谢谢。我曾经听过这个,但以前从未想过使用它。我认为我已经习惯了会话范围,在那里一切都在其位置上。我得试试这个 :) - Bertie
CDI没有实现@ViewScoped,你在CODI和Seam3之间有偏好吗? - Thang Pham
考虑到我是Seam 3 Faces模块的负责人,我有一些(有点偏见的)偏好 ;)看看这两个项目还提供了什么,选择最符合您需求的。 - Brian Leathem

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接