JSF ajax更新

时间:2015-03-26 12:02:31

标签: ajax jsf icefaces

我问过这个问题,但我没有得到任何帮助。 假设我在xhtml

中有这部分代码
<h:form id="viewSnForm" prependId="false">   

                <h:commandButton  id="kopce" value="kopce">
                    <f:ajax event="click" render="panelTarget" execute="kopce" listener="#{myBean.loop()}"></f:ajax>
                </h:commandButton>
                <h:panelGroup id="panelTarget">
                    <h:outputText id="target" value="#{myBean.num}"/>
                </h:panelGroup>

            </h:form>

我的支持bean myBean.java看起来像这样

public void runMyScript(){
    JavaScriptRunner.runScript(FacesContext.getCurrentInstance(),
            "console.log('my_check'); document.getElementById('target').innerHTML = " + this.num + ";");
}

public void loop(){

    for (int i = 0; i < 10; i++) {
        this.num += 1;

        runMyScript();
        try {
            Thread.sleep(2000);
        } catch (InterruptedException ex) {
            Logger.getLogger(MyCompanyBean.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

在我的bean中我数到10,我喜欢在每个仪器中模拟2秒等待,但在我的xhtml中,我没有立即看到响应,只有在方法完成时才会看到。在我的浏览器控制台中,我可以看到所有my_check日志,但只有在通过20秒时才能看到。 我想要的是每2秒后显示num,即loop()方法中的每一个增量。

此代码只是即兴创作。我真正想做的是将百分比附加到我的加载微调器。

我尝试了不同的解决方案,但没有一个能适合我。请与我分享您的意见和经验。

提前致谢

1 个答案:

答案 0 :(得分:0)

这是预期的行为。由于在正常方法调用中,服务器仅在方法完成时将数据发送回客户端。两种可能的解决方案:

  • 使用客户端轮询
  • 使用服务器推送

通过一些非常简单的谷歌使用,我发现this icefaces component支持两者(我甚至不是IceFaces用户)