Да, вы можете сделать это, используя Richfaces <a4j:poll>
, который будет периодически опрашивать запрос к серверу.Например,
Просмотр:
<a4j:region>
<h:form>
<a4j:poll id="poll" enabled="#{testBean.enablePolling}" reRender="consoleOutput,poll" />
</h:form>
</a4j:region>
<h:form>
<a4j:jsFunction name="startBuild" action="#{testBean.startBuild}" />
<a4j:commandButton value="Start Build" action="#{testBean.startPolling}" oncomplete="startBuild()" reRender="poll"/>
<hr/>
<h:outputText id="consoleOutput" value="#{testBean.consoleOuput}" escape="false"/>
</h:form>
MBean:
public class TestBean {
private boolean enablePolling;
private StringBuffer buildOutputSb = new StringBuffer();
public TestBean() {
}
public boolean isEnablePolling() {
return enablePolling;
}
public void setEnablePolling(boolean enablePolling) {
this.enablePolling = enablePolling;
}
public void startPolling(){
this.enablePolling = true;
}
public void startBuild(){
this.buildOutputSb= new StringBuffer();
//Stimulating the build process , which will output the log message to the buildOutputSb
for (int i=0 ; i <10 ; i++){
buildOutputSb.append("Output").append(i).append("<br/>");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
this.enablePolling = false;
}
}
Сообщения журнала, выдаваемыеСценарий сборки добавляется к строковому буферу (buildOutputSb), и мы используем <h:outputText id="consoleOutput">
для отображения значения из этого строкового буфера в пользовательском интерфейсе.
После нажатия кнопки «Начать сборку», enablePolling
свойства будут иметь значение true, что разрешит <a4j:poll id="poll">
и заставит его периодически опрашивать сервер.В то же время, startBuild()
(т.е. процесс сборки) будет запущен. <a4j:poll id="poll" >
будет reRender
(т.е. обновлять) <h:outputText id="consoleOutput">
после каждого раунда опроса, так что это все равно что обновить <h:outputText id="consoleOutput">
и, следовательно,обновляя сообщения журнала сценария сборки.
Поскольку <a4j:poll>
будет отправлять запрос для каждого раунда пула, я регистрирую MBean в session scope
, чтобы предотвратить его создание много раз.
Вы можете обратиться к официальной демоверсии 1031 * для получения дополнительной информации о <a4j:poll>
и лучших методах ее использования.Например, предлагается, чтобы была отдельная форма для <a4j:poll>
и окружающая <a4j:poll>
с <a4j:region>