【问题标题】:JSF CDI : Conversation scope bean[s] best practiceJSF CDI:对话范围 bean[s] 最佳实践
【发布时间】:2011-05-13 18:27:10
【问题描述】:

我目前正在学习 JSF 2.0,我很高兴这个对话范围功能的存在,这对于在同一页面上打开新选项卡或新窗口并拥有单独的资源,而不是相互覆盖非常有帮助.

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

在我的例子中,每个 JSF 页面都有每个 CDI bean。假设我有一个菜单,当它被点击时,这将导致页面 A,从 A,可能会导致 B,B 可能会导致 C,C 可能会导致 D,所有这 4 个页面都连接在一起链。

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

现在我很困惑:

  • 是否所有这些 A B C D 是否在对话范围内,或 也许只是 A ?因为我认为 有时来自另一个页面 在 ABCD 链之外,像一个页面 F,它可以导航到页面B, 虽然我不知道怎么供应 数据到 bean B 呢。
  • 是否所有这些 A B C D 合为一豆
  • 何时何地开始 谈话,我在想 构造函数,但我不认为这是一个 好主意,因为我更喜欢开始 首次访问时的对话 页面,而不是 bean
  • 何时何地停止 对话,这样就不会有 闲置的资源闲置

请分享您对此的看法。

【问题讨论】:

  • CDI 不是标准 JSF 的一部分。 CDI 代表上下文和依赖注入 (JSR-299),它涵盖了 javax.enterprise 包的注释。对话范围也不是标准 JSF 的一部分。它是 JSF 1.2 时代的 JBoss Seam 发明,已被 JSF 2.0 规范采用为 View Scope,可通过 @ViewScoped 注释切换。现在,你到底在说什么?
  • 您好 BalusC,感谢您的澄清。我使用 CDI 一词只是为了说明我在使用什么,但也许该信息与我的问题无关,我的道歉:) 据我所知,@ViewScoped 用于重新显示单个页面,属性将是坚持。但我想从对话范围实现的是,我可以在多个选项卡上打开同一页面,每个选项卡都好像拥有自己的会话范围。因此,在选项卡上的 myBean.name 上提交值“albert”不会覆盖其他选项卡上的 myBean.name。但我对从哪里开始和结束谈话感到困惑。
  • 如果有4个页面,这让我更加困惑,例如页面A是浏览页面,用户可以搜索,页面B是详细页面,用户可以修改详细信息,页面C 是用户可以修改子细节的地方,等等。如果我希望能够在多个选项卡中打开页面 A 而不会影响另一个,我必须在 A 的 bean 上使用对话范围。但我想这也将成为 B C 和 D 的对话范围?还有关于我应该在何时何地开始/结束对话。我的意思是,用户可以打开新标签,然后关闭标签。我如何检测到这一点并关闭对话?
  • Albert,在回复不是评论者自己的帖子中的 cmets 时,使用 @nickname@BalusC 一样让他们自动收到有关评论回复的通知。另见meta.stackexchange.com/questions/43019/…

标签: java jsf jsf-2


【解决方案1】:

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

您描述的范围可能更适合自定义范围,例如窗口范围。实现此范围的两个项目是:

  1. Apache MyFaces CODI
  2. IceFaces 有一个 JSF(非 CDI)Window scope implementation

尽管如此,我还是鼓励您重新考虑您的 bean 结构。我自己也非常喜欢 View 范围,再加上 JSF 2 视图参数以将信息从一个页面传播到另一个页面(以及从一个 View 范围实例到另一个)。

MyFaces“查看访问”范围似乎是另一种巧妙的方法,只要您浏览的页面保持对该范围的引用,bean 就会保持在范围内。

【讨论】:

  • 谢谢!我也一直在考虑 View 范围,它也可以在多选项卡或多窗口环境中使用。您将视图参数从一个视图范围传递到另一个视图范围的意思是,通过 h:button 和嵌套的 f:param 以及使用嵌套 f:viewParam 的 f:metadata 实现的参数,我正确吗?如果我没记错的话,h:button 将导致 GET 请求,这对我来说是个问题,因为有时,例如,从页面 B(POST)按删除会将导航返回到页面 A。有没有办法在这种情况下将视图参数从 B 发送到 A ?
  • 您可以将字符串“?includeViewParams=true”附加到导航规则中,“着陆页”上定义的视图参数将自动包含在内。
  • 好的,谢谢。读过一次,但以前从未想过使用它。我想我已经习惯了一切都在哪里的会话范围。一定要试试这个:)
  • CDI 没有实现@ViewScoped,你在 CODI 和 Seam3 之间有偏好吗?
  • 鉴于我是 Seam 3 Faces Module 的负责人,我确实有一个(有些偏颇的)偏好;)看看这两个项目还提供了什么,然后选择最符合您需求的。
猜你喜欢
  • 2012-08-03
  • 1970-01-01
  • 2014-07-17
  • 2010-10-19
  • 2012-01-20
  • 1970-01-01
  • 2012-11-21
  • 2013-02-15
  • 2017-11-26
相关资源
最近更新 更多