我想在页面显示后加载几个数字列表。这些列表放在页面的不同元素上。到目前为止我选择的方法是为每个必须加载的数字列表创建一个a4j:jsFunction,并在文档准备就绪时使用jQuery来触发这些函数。
我正在使用JSF 1.2,Facelets 1.1.14和Richfaces 3.3.3。代码的相关部分如下。
XHTML:
<c:forEach items="#{testMB.list}" var="item" varStatus="status">
<a4j:jsFunction name="loadNumbers_#{status.index}" action="#{testMB.loadNumbers}" reRender="numbers_#{status.index}">
<a4j:actionparam name="index" value="#{status.index}" />
</a4j:jsFunction>
</c:forEach>
<script type="text/javascript">
//<![CDATA[
jQuery(document).ready(function($) {
for (var i = 0; i < #{jstl:length(testMB.list)}; i++) {
window['loadNumbers_' + i]();
}
});
//]]>
</script>
Managed Bean:
public void loadNumbers() {
Map<String, String> params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
int index = Integer.parseInt(params.get("index"));
MyObject obj = list.get(index);
obj.setNumbers(testBC.loadNumbers(obj));
}
服务器基本上同时接收所有ajax请求。看来这种并发性已经引发了一些问题。例如,有时,某些请求不会调用托管bean中的操作方法。有时,即使为所有请求调用了action方法,响应中也会丢失一些列表。
在a4j中使用eventsQueue:jsFunction解决了这个问题,因为这会创建一个队列来阻止并发请求。使动作方法同步似乎也解决了这个问题。但是,对于我一直在测试的场景,前者和后者的解决方案分别需要大约55秒和30秒,而第一种方法只需要大约12秒即可加载并显示正确加载后的所有数字列表。由于数字列表的计算可能需要一段时间,我希望利用并发计算来及时显示它们。
我很感激有关如何解决此问题的任何意见/建议。
答案 0 :(得分:0)
可以使用 a4j:民意调查或 a4j:推送
来完成我的建议是。
使用 a4j:outputPanel 或 t:panelGroup 将名称命名为“列表”
使用 a4j:民意调查或 a4j:推送刷新 rerender ='lists'
希望这有帮助