gpt4 book ai didi

java - 如何在工作过程中刷新 View

转载 作者:行者123 更新时间:2023-11-29 09:11:35 24 4
gpt4 key购买 nike

我想寻求有关“刷新 View ”问题的帮助;)

我有一个应用程序检查数据库中的一些数据。整个过程需要很长时间 f.e 一个小时,所以我想通知用户在特定时刻发生了什么(f.e 元素 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. UI插入

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

    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 轮询将使用 viewBean getLog 刷新包含数据表的对话框。
此时数据流如下所示:

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

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

谢谢你的帮助..

最佳答案

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


关于java - 如何在工作过程中刷新 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12077620/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com