【问题标题】:Persisting ViewScoped beans across multiple views跨多个视图持久化 ViewScoped bean
【发布时间】:2013-03-12 01:43:09
【问题描述】:

好的,我知道范围问题总是会出现,但我对解决方案的一种稍微不同的方法很感兴趣。 @ViewScope 是@RequestScope 和@SessionScope 之间的一座奇妙的桥梁。

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

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

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

【问题讨论】:

    标签: jsf managed-bean view-scope


    【解决方案1】:

    我不知道这是否是“公认的解决方案”,但我已经实现了一个适合我的想法。 (感谢反馈!)

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

    private static Map<String, Object> objectVariableMap;
    
    // Getters, setters and methods etc. are omitted for simplicity
    

    我的想法是我指定了一个地图,它接受一个 String 作为键和一个 Object 作为值。我没有专门设置对象的类型以允许我在其中存储 any 类型的对象。需要注意的是,您需要在检索对象时确定对象的类型,以便将其转换回其原始类型。

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

    我从不热衷于在 URL 参数中传递用户 ID 等数据(即使它已加密)。这个想法还有一个额外的好处,那就是提供具有可指定生命周期的一次性 URL 值。

    在接收端(即新的@ViewScoped bean,或任何其他范围),您使用&lt;f:paramView&gt; 在URL 参数(映射键)中读取,然后使用preRenderView 事件检索并设置使用的对象。

    此时,您可以选择从 Map 中删除密钥对并使检索该对象的能力无效,或者您可以通过简单地更新对象(如果有任何更改)将密钥对保留更长时间。

    更新:从概念上讲,这真的很成功(至少对我而言)。我围绕这个概念创建了一些有用的方法和类,以使其更加通用。如果有人想要更具体的说明,或者如果有人想要,我什至可以创建一个小型图书馆。

    【讨论】:

      【解决方案2】:

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

      如果你传递参数的页面是一个单元,你也可以在JSF 2.2中将它们做成一个流,并使用流作用域。

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

      【讨论】:

      • 我已经使用了很多ConversationScoped,但我从来没有很好地使用它。它有它的用途,但我最初真的在寻找一种将一个 ViewScoped 对象传递给另一个对象的方法。 CODI 和 DeltaSpike(以前称为 Seams Faces)再次为 CDI 提供 JSF 实现。我真的在寻找一种在需要时将对象从作用域传递到作用域的通用方法。
      • 请求技巧中有导航,它可以将内容从一个页面切换到另一个页面,但您会遇到地址栏问题的后置 URL。
      • 是的。它有点难看,但我还写了一些 JS 来用 ajax 替换页面的主要内容,并使用 html5 历史 API 来做类似的事情。问题是它不是一个很好的用户体验。
      • 顺便说一句,还有 Flash,但至少在 Mojarra 上这是非常不安全的。
      猜你喜欢
      • 2015-11-03
      • 2016-05-02
      • 2014-06-21
      • 2014-11-08
      • 1970-01-01
      • 2013-11-20
      • 2017-09-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多