JSF - 适当的 Bean 作用域,用于在页面之间保留数据,但仅保留"browser tab related"



我正在使用JSF 2.2.20创建一个web应用程序;有点巫师">允许用户填写输入字段并通过导航来回查看页面的流程。对于所有这些视图,我使用单个bean

假设我有视图A.xhtmlB.xhtmlC.xhtmlD.xhtml它们都由同一个bean管理MyBean.java

我希望我的申请是">浏览器选项卡作用域";,这意味着

  1. I不希望我的bean的数据在每次HTTP请求后都被重新实例化,就像@RequestScopedbean发生的那样,或者在视图更改后,就像@ViewScoped发生的那样。我希望我的bean的数据在视图更改和重定向之间保留,这样用户就可以在页面之间来回切换,而不会丢失他已经提供的数据
  2. 不希望使用@SessionScoped作用域,因为每次用户打开新选项卡时;A.xhtml

是否有任何内置的方法可以使用当前JSF版本实现上述场景?如果没有,你能提出解决办法吗?

提前感谢!

我认为@ViewScoped是您想要的,但它取决于您的确切用法。

注意事项:

  • 使用javax.faces.view.ViewScoped。不要使用不推荐使用的托管bean注释,因为它的工作方式不同
  • @ViewScoped的工作原理是将bean存储在视图中。因此,每次加载页面时,都会得到一个视图和对应于该视图的viewId。因此,有效地,页面的每个加载(可以读作"每个浏览器选项卡"(都有自己的bean
  • @ViewScoped是一个钝化范围。这意味着您的bean及其注入的依赖项确实需要是Serializable
  • 使用应用服务器的最新版本,或者如果您手动引入MyFaces,请使用最新版本。5年多前,我发现许多旧版本的实现存在缺陷,但现在它似乎可以完美地工作

如果出现页面导航,您可能需要使用FlowScoped。这是一个多页bean,在您结束"流"之前一直保持活动状态。

如果这两种方法都不起作用,那么您总是可以实现自己的作用域,这对于CDI来说非常容易。

最新更新