【问题标题】:How to restore ViewScoped bean when user clicks back button?用户单击后退按钮时如何恢复 ViewScoped bean?
【发布时间】:2017-07-20 16:28:28
【问题描述】:

假设我在当前页面 A 后面有一个 @ViewScoped Bean。现在用户通过正常的 get 请求导航到页面 B,比如说 www.google.com。 当用户单击浏览器的后退按钮时,我想恢复上一页的@ViewScope,使其与离开时完全一样。这有可能以某种方式实现吗?

我不想将我的页面设为 A @SessionScoped,以便支持 bean 在两个浏览器选项卡中打开时不会干扰彼此的状态。

【问题讨论】:

  • 在 Ajaxical 请求的情况下,没有恢复的问题 - JSF 或其他。在其他情况下,如果页面导航是通过 HTTP POST 请求完成的,那么所使用的页面导航的整个概念是不稳定的,需要重新考虑使用 HTTP GET 请求提供必要的请求参数(在任何 Web 项目中始终使用相应的可收藏 URL 的页面导航使用 HTTP GET 请求进行)。
  • 在@PreDestroy() 中保留值,并在@PostContruct() 方法中取回它们。或查看链接stackoverflow.com/questions/1282251/… 以了解如何将它们存储在会话中。

标签: jsf cdi java-ee-7


【解决方案1】:

由于 2.6 版 OmniFaces 有这个功能,被称为 @ViewScoped(saveInViewState = true) 但要小心一些!

了解此设置对 JSF 视图状态的大小有潜在的重大影响非常重要,尤其是当视图范围的 bean 实例包含“太多”数据时,例如数据表的实体集合,并且这些 bean 实际上永远不会过期,因为它们完全存储在 HTML 页面的 javax.faces.ViewState 隐藏输入字段中。此外,此类 bean 上的 @PreDestroy 注释方法将永远不会被显式调用,即使在卸载时也不会被调用,因为很有可能保存或缓存页面源并在(很久)稍后重新执行它。

更编程的解决方案是@ConversationScoped。使用转换 ID 作为参数,您可以恢复视图。 conversationscope example

【讨论】:

  • 感谢您的建议。我不确定这种方法的含义,但我会研究一下。
【解决方案2】:

是的,可以使用 f:param 传递这样的参数,这会将您的参数传递到下一个屏幕。

    <h:commandLink action="screenName" value="#{search.participantName}">
    <f:param value="#{searchcus.participantId}" name="PARTICIPANT_ID"/>
    <f:param name="PARENT_SCREEN_CODE" value="SEARCH_PARTICIPANT"/>
    </h:commandLink>

之后在 init() 方法中获取值作为参数来获取结果。

【讨论】:

    猜你喜欢
    • 2011-12-18
    • 1970-01-01
    • 2012-07-17
    • 2018-12-21
    • 1970-01-01
    • 1970-01-01
    • 2011-05-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多