以下是代码的第一部分:(目标=每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>
从理论上讲,也许它应该有用但我的<p:inputTextarea>
不会逐步填补。
它等待“长时间运行”方法的结束。
答案 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>
,并打印出越来越多的字符。