Так, вроде разобрался с этим. Остался тольк оодин вопрос: можно ли сделать так, чтоб первый вызов a4j:poll производился сразу после загрузки, а не по истечению таймера? Если кто поможет, буду очень благодарен.
Далее, как это делается (вдруг кому пригодится):
| Код | public void updateLogs(ActionEvent event) { FacesContext facesContext = FacesContext.getCurrentInstance(); AjaxContext ajaxContext = AjaxContext.getCurrentInstance(facesContext); List<CommandMessageBean> data = new Vector<CommandMessageBean> (); List<CommandBean> cmds = CommandStore.getInstance().getCommands(getSessionId()); synchronized (cmds) { if (cmds != null) { for(CommandBean cmd: cmds) { data.addAll(cmd.getNewMessages()); } } } ajaxContext.setResponseData(data); } public boolean isNotCompleted() { List<CommandBean> cmds = CommandStore.getInstance().getCommands(getSessionId()); synchronized (cmds) { if (cmds != null) { for(CommandBean cmd: cmds) { if (cmd.getState() != CommandBean.FINISHED) { return true; } }; }; }; return false; }
|
Сама страница:
| Код | <h:form> <a4j:poll id="a4j_poll0" interval="10000" actionListener="#{cmdManagerBean.updateLogs}" enabled="#{cmdManagerBean.notCompleted}" oncomplete="updateLogs(document, event, data);"/> </h:form> <table bgcolor="#000000" cellspacing="1" cellpadding="3" border="0"> <c:forEach var="cmd" items="#{cmdManagerBean.commands}"> <tr> <td bgcolor="#C0C0C0" valign="top"> ... </td> <td bgcolor="#FFFFFF"> <div id="cmd_log_#{cmd.id}"> </div> </td> </tr> </c:forEach> </table>
|
И код на JavaScript к-ый делает это обновление:
| Код | function updateLogs(doc, event, data) { for(i = 0; i < data.length; i++) { cmd_id = data[i].commandId; msg = data[i].message; status = data[i].status; msg = msg.replace("\n", "<br/>") + "<br/>"; ddiv = doc.getElementById('cmd_log_' + cmd_id); if (ddiv) ddiv.innerHTML += msg; } }
|
Послдений пока не доработан, ибо в IE не отображаются HTML тэги, при добавлении в div. |