在多个视图中保持ViewScoped bean

时间:2013-03-22 09:00:31

标签: jsf managed-bean view-scope

好的我知道范围问题一直存在,但我对解决方案的方法略有不同感兴趣。 @ViewScope@RequestScope@SessionScope之间的绝佳桥梁。

然而,仍有一个常见的用例(至少对我而言),我真的不想使用@SessionScope,但我需要几个视图的数据。一个非常简单的情况是,我根据之前的选择将多个数据表链接在一起。

完全可以使用<f:paramView>并将一个或几个数据作为params传递到地址中,然后再次从数据库中检索所有内容。我更感兴趣的是找到一种方法来创建bean状态/变量的“快照”,创建新的@ViewScope,然后将“快照状态”恢复到新bean。

这样的事情存在吗?想法?意见?

2 个答案:

答案 0 :(得分:2)

我不知道这是否是'接受的解决方案',但我已经实现了一个适合我的想法。 (反馈赞赏!)

所以我创建了一个带有几个静态地图的@SessionScoped类:

private static Map<String, Object> objectVariableMap;

// Getters, setters and methods etc. are omitted for simplicity

我的想法是指定了一个地图,该地图接受 String 作为键, Object 作为值。我特别没有设置对象的类型,以允许我在那里存储任何类型的对象。需要注意的是,在检索对象时需要确定对象的类型,以便将其转换回原始类型。

现在是时候设置第一个@ViewScoped的数据了。我生成一个随机UUID(或任何你想要的)作为Map ,然后将设置为我正在使用的对象(即{{1}。或者你可能想要传递给下一个视图的任何其他对象。将键值保存到地图中,并将URL参数设置为键。

我从不热衷于在URL参数中传递用户ID等数据(即使加密)。这个想法的另一个好处是提供具有可指定寿命的可丢弃URL值。

在接收端(即新的this bean或任何其他范围),您使用@ViewScoped读取URL参数(地图密钥),然后使用{{ 1}}事件检索和设置使用的对象。

此时,您可以选择从地图中删除密钥对,并使检索该对象的功能无效,或者如果有任何更改,只需更新对象,就可以保持密钥对的持续时间更长。

更新:从概念上讲,这非常成功(至少对我来说)。我创建了一些围绕这个概念的有用方法和类,以使其更具通用性。如果有人想要更具体的指示,或者如果有人想要我甚至可能创建一个小型库。

答案 1 :(得分:1)

您可以使用CDI“对话范围”。这比会话范围窄,但比视图范围更宽。

如果传递参数的页面是一个单元,您也可以在JSF 2.2中创建它们并使用流量范围。

像CODI这样的项目提供了可在页面之间使用的各种其他范围。