【问题标题】:How to refresh view during working process如何在工作过程中刷新视图
【发布时间】:2012-08-22 16:36:16
【问题描述】:

我想就我的“刷新视图”问题寻求帮助;)

我有一个应用程序可以检查数据库中的一些数据。整个过程需要很长时间 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. 动作类

    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 中的 for 循环),并且 ajax 轮询将使用 viewBean getLog 刷新带有数据表的对话框。
此时数据流看起来像:

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

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

感谢您的帮助..

【问题讨论】:

  • 问题是您的操作方法按请求/响应顺序执行该过程。要解决您的问题,您必须寻求并行进程(我不建议在 Web 应用程序中启动 ThreadRunnable)。
  • 是否有任何方法可以使用请求上下文或一些 java 脚本从 Bean f.e 刷新视图?

标签: java jsf primefaces polling


【解决方案1】:

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


【讨论】:

  • 我在模板中有 p:poll,我在对话框内外尝试过,但没有任何效果..
  • 我认为是的,但是当进程在支持 bean 轮询中循环时不起作用..当视图从 bean 获得响应时它起作用(操作后)
  • 我不知道 ajax 的内部原理,但我猜一次只能有一个请求。一般来说,让 actiona 运行这么长时间并不是一个好主意。如果用户同意等会发生什么?我宁愿放弃行动并跟踪其过程。这可能实现起来有点复杂,但更简洁,给你更多的控制权并且更透明。
  • 我和 OP 有同样的问题:只有当视图得到 bean 的响应时,民意调查才会得到响应。我会对此问题的任何帮助感兴趣。
  • 我也有同样的问题,我的实现方法在这个link。我对任何帮助都很感兴趣。
猜你喜欢
  • 1970-01-01
  • 2014-07-07
  • 2018-04-12
  • 2021-07-08
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
相关资源
最近更新 更多