XPages:丢失viewScoped bean(再次)

时间:2015-09-17 10:23:06

标签: java xpages

我们有一个包含一些Accordions的页面。有些手风琴开始为空,当用户通过部分更新点击Accordion栏时,它们会被填满。一开始,这样可以正常工作,但如果用户在稍后阶段打开手风琴,则无法正常工作。

当用户离开手风琴,在同一个nsf中切换到不同页面,在那里做了很多事情,然后回到第一页时,就会发生这种情况。不知何故,不执行与部分刷新相关的代码。

以下是一些代码:

<xe:djAccordionPane id="djAccordionPane3">
    <xp:div id="outerPanelModels">
        <xc:ccModelView>
            <xc:this.rendered><![CDATA[#{javascript:UserData.getVar("ShowModels")}]]></xc:this.rendered>
        </xc:ccModelView>
    </xp:div>
    <xe:this.dojoAttributes>
        <xp:dojoAttribute name="Title" value="#{javascript:constants.Models}"></xp:dojoAttribute>
    </xe:this.dojoAttributes>
    <xp:eventHandler event="onShow" submit="true" refreshMode="partial"
        refreshId="outerPanelModels">
        <xp:this.onComplete><![CDATA[hideAjaxLoader();]]></xp:this.onComplete>
        <xe:this.script><![CDATA[if(document.getElementById("#{id:outerPanelModels}").childElementCount==0) {
    showAjaxLoader();
    return true
}
return false;]]></xe:this.script>
        <xe:this.action><![CDATA[#{javascript:UserData.putVar("ShowModels", true)}]]></xe:this.action>
    </xp:eventHandler>
</xe:djAccordionPane>

UserData是一个sessionScope bean。 putVar和getVar曾经​​在一个viewScope bean中,我怀疑这个bean会以某种方式被破坏(实际上是这样)所以我把代码移到了sessionScope。

为什么底部的代码行没有被执行,即带有UserData.putVar的行(“ShowModels”,true)?有线索吗?解决方案可能??

谢谢!

更新 应用程序设置为将所有页面保留在内存中。

xsp.properties:

xsp.error.page=xError.xsp
xsp.library.depends=com.ibm.xsp.extlib.library
xsp.min.version=8.5.3
xsp.persistence.mode=basic
xsp.resources.aggregate=false
xsp.theme.web=extendOneUI.theme

xsp.openlog.expireDate=15

xsp.error.page=Error.xsp
xsp.persistence.viewstate=fullstate
# org.openntf.domino.xsp=godmode,marcel,bubbleExceptions
xsp.application.forcefullrefresh=true
xsp.error.page.default=true
xsp.session.timeout=180
xsp.application.timeout=180

1 个答案:

答案 0 :(得分:1)

查看xsp.properties,特别是要保留在内存中并保留在磁盘上的页数的持久性属性。还有默认设置。

一旦存储了一定数量的组件树,如果您尝试存储另一个组件树,则最早将被转储。在您正在描述的场景中,听起来它正在使用accordion容器转储页面的组件树,这也会转储UserData viewScoped变量。

没有灵丹妙药的答案,这将取决于您的应用程序以及用户如何与之交互。它还取决于你是将所有页面保存在内存中,所有页面都保存在磁盘上还是混合使用中。基本上,如果您允许用户在浏览器中打开同一NSF的其他选项卡,除非您可以保持该页面的组件树可用,否则存在组件树丢失的风险,因为服务器端无法知道它是什么仍然在浏览器中打开。

相关问题