如何在用户单击后退按钮时恢复ViewScoped bean?

时间:2017-07-20 16:28:28

标签: jsf cdi java-ee-7

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

我不想让我的页面成为@SessionScoped,以便在两个浏览器选项卡中打开时,后备bean不会打扰彼此的状态。

2 个答案:

答案 0 :(得分:0)

由于版本2.6 OmniFaces具有此功能,因此称为@ViewScoped(saveInViewState = true),但要谨慎!

  

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

更具规划性的解决方案是@ConversationScoped。使用conversionation id作为参数可以恢复视图。 conversationscope example

答案 1 :(得分:0)

是的,可以使用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()方法中获取值作为获取结果的参数。