好的我知道范围问题一直存在,但我对解决方案的方法略有不同感兴趣。 @ViewScope
是@RequestScope
和@SessionScope
之间的绝佳桥梁。
然而,仍有一个常见的用例(至少对我而言),我真的不想使用@SessionScope
,但我需要几个视图的数据。一个非常简单的情况是,我根据之前的选择将多个数据表链接在一起。
完全可以使用<f:paramView>
并将一个或几个数据作为params传递到地址中,然后再次从数据库中检索所有内容。我更感兴趣的是找到一种方法来创建bean状态/变量的“快照”,创建新的@ViewScope
,然后将“快照状态”恢复到新bean。
这样的事情存在吗?想法?意见?
答案 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这样的项目提供了可在页面之间使用的各种其他范围。