如何在Jsf中同步a4j:jsFunction和actionListener

时间:2010-10-13 13:05:36

标签: jsf jsf-2 ajax4jsf

我有以下代码用于执行,但它提供了一些与ajax请求相关的问题。

actionListener调用按钮单击

<a4j:commandButton value="Submit" alt="OligoWalk" styleClass="common_button" onclick="createNewLog();showProgressLayer();" oncomplete="parent.document.getElementById('resultFrm').src ='#{MyResearchView.resultToShow}';parent.reRenderLogSection();" actionListener="#{MyResearchView.executeTool}">        <f:attribute name="toolClass" value="com.sequerome.service.impl.tools.Oligowalk" />
<f:attribute name="toolId" value="#{ToolCustomeFormView.toolId}" />   <f:attribute name="toolName" value="#{ToolCustomeFormView.toolName}" />                    <f:attribute name="inputParamFile" value="#{ToolCustomeFormView.inputParamFile}" />
<f:attribute name="paramMap" value="#{ToolCustomeFormView.toolParamBean.paramMap}" />
</a4j:commandButton>

A4j:jsFunction

<a4j:jsFunction name="createNewLog"
   actionListener="#{MyResearchView.createNewLogEntry}"
   oncomplete="parent.reRenderLogSection();executeTool();">
   <f:attribute name="toolId" value="#{ToolCustomeFormView.toolId}" />
   <f:attribute name="toolName" value="#{ToolCustomeFormView.toolName}"/></a4j:jsFunction>
  1. createNewLog()函数必须先完成
  2. executeTool()函数必须在此之后完成。
  3. 目前它以相同的方式调用,但是createNewLog()函数的一半先执行,然后执行executeTool()函数。这里需要执行一些代码,然后再向createNewlog()函数移动。在此之后执行createNewLog(),然后再次执行executeTool()。

    <a4j:commandButton value="Submit" alt="OligoWalk" styleClass="common_button" onclick="createNewLog();showProgressLayer();" oncomplete="parent.document.getElementById('resultFrm').src ='#{MyResearchView.resultToShow}';parent.reRenderLogSection();" actionListener="#{MyResearchView.executeTool}">        <f:attribute name="toolClass" value="com.sequerome.service.impl.tools.Oligowalk" />
    <f:attribute name="toolId" value="#{ToolCustomeFormView.toolId}" />   <f:attribute name="toolName" value="#{ToolCustomeFormView.toolName}" />                    <f:attribute name="inputParamFile" value="#{ToolCustomeFormView.inputParamFile}" />
    <f:attribute name="paramMap" value="#{ToolCustomeFormView.toolParamBean.paramMap}" />
    </a4j:commandButton>
    
    <a4j:jsFunction name="createNewLog"
       actionListener="#{MyResearchView.createNewLogEntry}"
       oncomplete="parent.reRenderLogSection();executeTool();">
       <f:attribute name="toolId" value="#{ToolCustomeFormView.toolId}" />
       <f:attribute name="toolName" value="#{ToolCustomeFormView.toolName}"/></a4j:jsFunction>
    

2 个答案:

答案 0 :(得分:0)

不确定你的目标是什么。一些代码会有所帮助。对于a4j:jsFunction,有一个名为oncomplete的javascript事件。我想一种方法是在收到此事件时调用其他js函数...

答案 1 :(得分:0)

症状可能是a4j:函数是异步函数的结果。我相信幕后发生的事情是:

  • createNewLog();
    • 调用a4j:function
    • a4j:函数发送请求
    • a4j:函数返回(请求仍在发生)
  • showProgressLayer();
    • 调用a4j:function
    • a4j:fucntion发送请求(createNewLog请求恰好已经完成了一半)
    • a4j:函数返回(请求仍在发生)
  • 触发了actionListener请求
    • 请求在服务器上执行,可能在createNewLog和showProgressLayer仍在运行时

解决方案是在客户端添加queues,在服务器端添加synchronization