我正在使用JSF 2.2.20创建一个web应用程序;有点巫师">允许用户填写输入字段并通过导航来回查看页面的流程。对于所有这些视图,我使用单个bean。
假设我有视图A.xhtml、B.xhtml、C.xhtmlD.xhtml它们都由同一个bean管理MyBean.java
我希望我的申请是">浏览器选项卡作用域";,这意味着
- I不希望我的bean的数据在每次HTTP请求后都被重新实例化,就像
@RequestScoped
bean发生的那样,或者在视图更改后,就像@ViewScoped
发生的那样。我希望我的bean的数据在视图更改和重定向之间保留,这样用户就可以在页面之间来回切换,而不会丢失他已经提供的数据 - 我不希望使用
@SessionScoped
作用域,因为每次用户打开新选项卡时;A.xhtml
是否有任何内置的方法可以使用当前JSF版本实现上述场景?如果没有,你能提出解决办法吗?
提前感谢!
我认为@ViewScoped
是您想要的,但它取决于您的确切用法。
注意事项:
- 使用
javax.faces.view.ViewScoped
。不要使用不推荐使用的托管bean注释,因为它的工作方式不同 @ViewScoped
的工作原理是将bean存储在视图中。因此,每次加载页面时,都会得到一个视图和对应于该视图的viewId。因此,有效地,页面的每个加载(可以读作"每个浏览器选项卡"(都有自己的bean@ViewScoped
是一个钝化范围。这意味着您的bean及其注入的依赖项确实需要是Serializable
- 使用应用服务器的最新版本,或者如果您手动引入MyFaces,请使用最新版本。5年多前,我发现许多旧版本的实现存在缺陷,但现在它似乎可以完美地工作
如果出现页面导航,您可能需要使用FlowScoped。这是一个多页bean,在您结束"流"之前一直保持活动状态。
如果这两种方法都不起作用,那么您总是可以实现自己的作用域,这对于CDI来说非常容易。