我想询问有关“刷新视图”问题的帮助;)
我有一个应用程序可以检查数据库中的一些数据。整个过程需要很长时间f.e一小时,所以我想告知用户在特定时刻发生了什么(f.e元素1已检查,元素2已检查等等)。我的问题是当'check process'在bean中工作时如何做。
我有一个带对话框的模板,命令按钮在启动时调用它,并在方法完成时隐藏。这工作正常,但问题发生在我想把日志信息放到这个对话框中。
代码:
模板
<h:body styleClass="workBody" onload="logToggle();">
<h:form id="form">
<p:ajaxStatus onstart="dialog.show();" onsuccess="dialog.hide();"/>
<p:poll interval="2" update="logScroll" global="false"/>
<p:dialog id="dialog" header="LOADING.." widgetVar="dialog" resizable="false"
width="400" modal="true" showEffect="clip" closable="false"
hideEffect="fold">
<br />
<p:scrollPanel style="height:300px" id="logScroll" mode="native">
<p:dataTable id="logPanel" var="log" value="#{viewBean.log}">
<p:column headerText="Log">
<h:outputText value="#{log}" />
</p:column>
</p:dataTable>
</p:scrollPanel>
<p:graphicImage value="resources/images/ajax-loader.gif" />
</p:dialog>
<p:layout fullPage="true" id ="layout">
<p:layoutUnit position="center" id="center">
<ui:insert name="center"></ui:insert>
</p:layoutUnit>
</p:layout>
</h:form>
UIInsert
<ui:define name="center">
<p:panel >
<p:commandButton value="Check" action="#{actionClass.checkProject}" />
</p:panel>
</ui:define>
ActionClass
public class AccionClass {
static Logger logger = Logger.getLogger(actionBean.class);
private ArrayList<String> log;
public ArrayList<String> getLog() {
return log;
}
public void setLog(ArrayList<String> log) {
this.log = log;
}
public void checkProject() {
try {
logger.info("Project Checking : started");
for (String sequence : selectedNodes) {
logger.info("Project Checking : node " + sourceNode.getName());
LinkedHashMap<String, Item> nodeElements = getNodeItems(sequence)
for (WsItem item : nodeElements.values()) {
checkItem(item);
}
}
} catch (Exception ex) {
logger.info("Check project exception", ex);
}
}
public void checkItem(Item item) {
logger.info("Checking item : started");
try {
Item itemToClone = sourceInstance.getApi().getVersionItem(version);
logger.info("Checking item : item " + itemToClone.getName() + " with version " + version);
log("info", "Checking item : item " + itemToClone.getName() + " with version " + version, false);
} catch (Exception e) {
messages.put("error in check item with version " + version, "Error");
logger.info("error in check item with version " + version);
}
}
public void log(String severity, String message, Boolean isMessage) {
log.add(message);
}
}
个ViewBean
@SessionScoped
@ManagedBean
public class ViewBean {
private ArrayList<String> log;
static Logger logger = Logger.getLogger(ViewBean.class);
public ActionClass action = new ActionClass();
public ArrayList<String> getLog() {
if (page.equals("checkProject")) {
return action.getLog();
} else return log;
}
public void setLog(ArrayList<String> log) {
this.log = log;
}
}
我的想法是,在checkProject调用之后,该进程将正常工作(对于actionClass中的循环),并且ajax poll将使用viewBean getLog刷新与datatable的对话框。
此时数据流如下:
当我没有清除logClass中的登录并再次执行此方法时,在第二步中我获得了上次调用的值,因此方法有效。
感谢您的帮助..