同时执行PrimeFaces p:poll

时间:2015-04-23 18:30:35

标签: jsf primefaces

以下是代码的第一部分:(目标=每2秒更新一个组件)

<p:poll id="pollid"
        async="true"
        immediate="true"
        interval="2"
        update="log"
        widgetVar="poll"/>

这是第二部分:(描述=长时间运行的功能,它将不断修改组件“log”)

<p:commandButton id="running"
                 value="#{Nbt.execution}"
                 actionListener="#{Nbt.launchModule}"
                 async="true"
                 ajax="true"
                 immediate="true"
                 update="log">
</p:commandButton>

详细信息:“log”是<p:inputTextarea>

的ID

从理论上讲,也许它应该有用但我的<p:inputTextarea>不会逐步填补。

它等待“长时间运行”方法的结束。

1 个答案:

答案 0 :(得分:1)

问题是当你update <p:inputTextarea>时,你还提交该文本区域的当前内容,这是空白的(JSF生命周期适用于那个组成部分)。将您的<p:inputTextarea>更改为<h:outputText>,它应该有效。

要说明问题,请参阅此Facelets页面:

<h:form>
    <p:inputTextarea id="txt_count" value="#{backingBean.text}"/>
    <p:poll interval="3" update="txt_count" />
    <p:commandButton value="Long running" async="true" action="#{backingBean.longRunning}"/>
</h:form>

这个支持bean:

@ManagedBean
@SessionScoped
public class BackingBean {
    private String text = "";
    public String getText() {
        System.out.println("GET: " + text);
        return text;
    }
    public void setText(String text) {
        System.out.println("SET: " + text);
        this.text = text;
    }
    public void longRunning() throws InterruptedException {
        text = "";
        for (int i = 0; i < 20; i++) {
            text += "a";
            Thread.sleep(1000);
        }
    }
}

运行它并单击按钮。服务器日志将显示如下内容:

Info: GET: 
Info: GET: 
Info: SET: 
Info: GET: a
Info: SET: 
Info: GET: 
Info: GET: aaa
Info: SET: 
Info: GET: 
Info: GET: aaa
Info: SET: 
Info: GET: 
Info: GET: aaa
Info: SET: 
Info: GET: 

如果您使用浏览器的开发人员工具,也可以在POST标题中看到这一点。

<p:inputTextarea>替换为<h:outputText>,并打印出越来越多的字符。