2

我有 RemoteCommand 校准 bean 方法时间滞后的性能问题。

使用我们的 xhtml 页面 primefaces 4.0 在运行时将大量 div 加载到面板中

<p:outputPanel id="runtime_panel" autoUpdate="true" />

一些 SelectOneRadio 控件通过 setOnchange() 方法具有侦听器。他们调用 RemoteCommand,它是在设计时在 xhtml 页面中定义的:

<p:remoteCommand name="ourRemoteCommand" 
actionListener="#{bean.someMethod}" update="runtime_panel"
/>

bean.someMethod 的目的是通过 ajax 在我们的页面中显示或隐藏某些 GUI 控件。Bean 是请求范围的。

问题是,从客户端调用bean.someMethod时存在一定的时间延迟。在我的测试中,javascript 突然响应,但是当我通过服务器端的断点捕获bean.someMethod时存在相当长的延迟- 大约 2.5 秒。

我还将 bean 范围更改为会话范围以消除构建阶段滞后,但这并不存在问题 - 它没有解决时间滞后。

如果“ runtime_panel ”中只有少量元素,我没有注意到任何滞后,并且断点立即在“bean.someMethod”中停止。控件数量和响应时间之间存在相关性。

我还创建了另一个测试 - 将虚拟 RemoteCommand 以自己的形式放在页面的开头。

<form>
<p:remoteCommand name="rcgg" partialSubmit="true" process="@this" update="@none" actionListener="#{bean.testMethod()}" />
<h:outputText id="msgs" value="Ajax Submit" />
<p:commandButton type="button" onclick="console.log('client start');rcgg('ddd');console.log('client end')" value="Ajax1" icon="ui-icon-refresh" />
</form> 

因此,服务器端代码也立即执行。但是当“outputPanel”有很多gui元素时,服务器端开始执行也会有时间延迟,甚至与这个RemoteCommand“rcgg”没有任何关系。奇怪的。

我还测试了几个 RemoteCommand arributes (

immediate="false" async="true" partialSubmit="true" ignoreAutoUpdate="true" process="@none" global="false"  
 update="@none"

) 但也没有成功。

我不知道如何摆脱这种“豆调用滞后”。
我真的需要你的帮助。

4

2 回答 2

1

通常你必须使用process=@thisonp:remoteCommand否则它将提交整个h:form及其组件。
所以最好把它们p:remoteCommand分开h:form

如果这也不起作用,您始终可以使用 ManagedBean 上的RequestContext'update方法来更新组件。

RequestContext.getCurrentInstance().update("COMPONENT_ID_TO_UPDATE")
于 2014-11-19T06:14:35.670 回答
0

这个技巧使用remoteCommand 加快了页面的开始加载内容。


Primefaces RemoteCommand 示例:

<p:remoteCommand name="load_users"
                 process="@this"
                 update="@form"
                 actionListener="#{myBean.loadUsers}" />

name属性p:remoteCommand是启动整个过程的无正文 JavaScript 代码。通过actionListener调用支持 bean 的 myBean.loadUsers,加载数据并导致表单 ( @form) 或目标组件的属性 ID 的部分更新。

下面的 JavaScript 片段在许多 jQuery 代码中很常见。它是 jQuery 就绪事件的处理程序。当页面准备好进行更多操作时,它会调用我们的load_users()JavaScript 函数,设置为 的name属性。remoteCommand此时页面已经开始渲染并且已经对用户可见。您需要将其包含在页面的开始部分中。

<script type="text/javascript">
    $(document).ready(function() {
        load_users(); 
    });            
</script>

参考:

于 2018-09-19T19:34:34.510 回答