繁体   English   中英

如何在工作过程中刷新视图

[英]How to refresh view during working process

我想询问有关“刷新视图”问题的帮助;)

我有一个检查数据库中某些数据的应用程序。 整个过程需要一个小时的时间,所以我想通知用户在特定时刻发生了什么事情(检查了元素1,检查了元素2,依此类推。)。 我的问题是当“检查过程”在Bean中工作时该怎么做。

我有一个带有对话框的模板,命令按钮在启动时调用它,并在方法完成时隐藏。 这可以正常工作,但是当我想将诸如日志信息之类的内容输入此对话框时,就会出现问题。

码:

  1. 模板

     <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> 

  2. UIInsert

     <ui:define name="center"> <p:panel > <p:commandButton value="Check" action="#{actionClass.checkProject}" /> </p:panel> </ui:define> 
  3. 动作类

     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); } } 
  4. 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刷新具有数据表的对话框。
此时,数据流如下所示:

  1. viewBean中的getLog每2秒调用一次。 在我单击commandButton之前。
  2. 在显示commandButton click对话框并获取没有值的Log后-数据表为空。
  3. checkProject运行正常,已将内容写入log4j记录器和actionClass日志,但未调用viewBean.getLog。
  4. 方法完成后,刷新视图并关闭对话框。

当我没有清除actionClass中的日志并再次执行此方法时,在第二步中,我从上次调用中获取了值,因此该方法有效。

感谢帮助..

我认为p:poll正是您想要的。


暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM