2010-11-22 64 views
10

我目前正在学习JSF 2.0,我很高兴看到这个对话范围功能的存在,这对于打开一个新标签页或一个新窗口非常有帮助相同的页面并拥有单独的资源,而不是相互压倒。JSF CDI:会话范围bean [s]最佳实践

但我很好奇如何以良好的方式实现这一点,关于何时开始对话以及何时关闭它。

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

从B或C或D豆访问A的bean属性是可能的,访问B的属性也可以从C或D豆等等。

现在即时通讯很困惑:

  • 是否所有这些A B C d应该在谈话范围 与否,或 也许只是一个?因为我认为 有时来自ABCD链之外的另一个页面 ,如页面 F,它可能导航到页面B, ,但我不知道如何向bean B提供 数据。
  • 是否所有这些ABCD应 合并成一个豆
  • 何时何地开始 交谈,即时通讯思考 构造函数,但我不认为这是一个 好主意,因为我更喜欢开始 谈话首先访问 当页面,而不是豆
  • 在哪里以及何时停止 谈话,因此有不会是 游逛
未使用的资源

请分享你对此的看法。

+3

CDI不是标准JSF的一部分。CDI代表上下文和依赖注入(JSR-299),它覆盖'javax.enterprise'包的注释。会话范围也不是标准JSF的一部分。它是JSF 1.2中的JBoss Seam发明,并且被JSF 2.0规范采用为View Scope,可以通过'@ ViewScoped'注释来触发。现在,你究竟在说什么? – BalusC 2010-11-22 10:59:26

+0

Hello BalusC,感谢您的澄清。我用CDI这个术语来说明我在使用什么,但也许这些信息与我的问题无关,我的道歉:)据我所知,@ViewScoped是单页重新显示,属性将是持续存在。但是我想从对话范围中获得的是,我可以在多个选项卡上打开相同的页面,每个选项卡就像拥有自己的会话范围一样。因此,在选项卡上的myBean.name上提交值'albert'将不会覆盖其他选项卡上的myBean.name。但我不知道从哪里开始和结束对话。 – bertie 2010-11-22 11:33:33

+0

如果有4页的话,这会让我更加困惑,例如,页面A是一个浏览页面,用户可以搜索,页面B是详细页面,用户可以修改细节,页面C是用户可以修改的页面细节等等。如果我想在几个标签中打开页面A而不会影响另一个页面,我必须在A的bean上使用对话范围。但是我想这对B C和D来说也是谈话范围?关于何时何地我应该开始/结束谈话。我的意思是,用户可以打开新的标签,并关闭标签。我如何检测到这一点并关闭对话? – bertie 2010-11-22 11:36:36

回答

11

JSF 2提供请求,视图,会话和应用程序范围。 CDI引入了对话范围,但更重要的是,它引入了一个新平台可以添加到平台的标准。

您所描述的范围可能更适合于自定义范围,如窗口范围。实施此范围内的两个项目分别是:

  1. Apache MyFaces CODI
  2. ICEfaces的有JSF(非CDI)Window scope implementation

不过,我会鼓励你重新思考你的bean结构。我自己非常喜欢View范围,加上JSF 2视图参数来将信息从一个页面传播到另一个页面(以及从一个View范围实例传播到另一个页面)。

MyFaces的“查看访问”范围看起来像另一种简洁的方法,只要您浏览的页面保持对该范围的引用,bean就停留在范围内。

+0

谢谢!我一直在考虑视图范围,它也可以用于多视图或多视窗环境。通过将视图参数从一个视图范围传递到另一个视图范围,您的意思是从h:button和嵌套的f:param,以及具有嵌套的f:viewParam的f:元数据实现的,我是否正确?如果我没有弄错,那么h:按钮会导致GET请求,这对我来说是一个问题,因为有时候,例如,从页面B(POST)中按下删除会将导航返回到页面A.是否有办法在这种情况下发送视图参数从B到A? – bertie 2010-11-24 04:40:42

+0

您可以将字符串“?includeViewParams = true”附加到导航规则中,并且“着陆页”上定义的视图参数将自动包含给您。 – 2010-11-24 05:47:06

+0

好的,谢谢。请阅读一次,但从未想过使用它。我认为我习惯了会议范围,一切都在这里。必须试试:) – bertie 2010-11-24 06:46:03