【问题标题】:Show progress image while executing JSF managed bean action在执行 JSF 托管 bean 操作时显示进度图像
【发布时间】:2011-03-04 16:43:26
【问题描述】:

我的问题适用于 Prime Faces 进度条,但任何香草 jsf 实现(使用 jquery)都会有所帮助。我的问题是当我开始长的 mysql 查询时,我也会渲染进度条。问题是它在数据查询完成后开始它的进度。我猜是因为在后端完成之前不会应用渲染阶段。我需要在另一个线程中启动进度条吗?

进度条不一定要显示查询的位置(如果可能的话)。我真的只是想展示应用程序的“思考”。也许有一些文字或动画 gif。感谢您的帮助。

编辑

这就是我所拥有的。

     <p:ajaxStatus>
            <f:facet name="start">
                <h:graphicImage value="/resources/images/ajax-loader-bar.gif" />
            </f:facet>

            <f:facet name="complete">
                <h:graphicImage value="/resources/images/ajax-loader-bar-still.gif" />
            </f:facet>

            <f:facet name="default">
                <h:graphicImage value="/resources/images/ajax-loader-bar-still.gif" />
            </f:facet>
        </p:ajaxStatus>

请求不是ajax。

  <p:commandButton value="Yes" update="growl"  onclick="confirmation.hide()"
                             action="#{viewLines.downloadFile}" ajax="false" /> 

背后的方法是。

    public void downloadFile() {

    if (selectedPkgLine != null) {

        ExcelSheet excelSheet = new ExcelSheet();
        FacesContext facesContext = FacesContext.getCurrentInstance();
        ExternalContext externalContext = facesContext.getExternalContext();

        String pkgLineName = StringUtils.removeSpaces(StringUtils.stripGarbage(selectedPkgLine.getShortname()));
        StringBuilder builder = new StringBuilder();
        builder.append(pkgLineName);
        builder.append(".xls");

        externalContext.setResponseContentType("application/vnd.ms-excel");
        externalContext.setResponseHeader("Content-Disposition", "attachment; filename=" + builder.toString());

        try {
            excelSheet.writeExcelSheet(this, externalContext.getResponseOutputStream());
        } catch (WriteException ex) {
            FacesUtils.addFatalMessage(ex.getMessage());
        } catch (IOException ex) {
            FacesUtils.addErrorMessage(ex.getMessage());
        } catch (ServletException ex) {
            FacesUtils.addErrorMessage(ex.getMessage());
        }

        facesContext.responseComplete();
    } else {
        submitDisabled = true;
        FacesUtils.addErrorMessage("No packaging line was selected");
    }
}

【问题讨论】:

    标签: jsf primefaces


    【解决方案1】:

    http://ajaxload.info 获取一些动画图标,使用 CSS display: none; 将其包含在您的页面中,并在 onclick 期间使用 JavaScript 使其成为 display: block;

    <h:commandButton onclick="document.getElementById('progress').style.display='block'" />
    <img id="progress" src="progress.gif" style="display:none" />
    

    或者如果您更喜欢 jQuery(它已经是 PrimeFaces 的一部分):

    <h:commandButton onclick="$('#progress').show()" />
    <img id="progress" src="progress.gif" style="display:none" />
    

    但这仅适用于同步请求。由于您使用的是 PrimeFaces,我建议改用 p:ajaxStatus,因为它会考虑异步(ajax)请求。只需将这段代码放在模板中的任何位置,您只需要其中一个。它适用于每个&lt;p:commandButton&gt;&lt;p:commandLink&gt; 没有 ajax="false"&lt;p:ajax&gt;

    <img id="progress" src="progress.gif" style="display:none" />
    <p:ajaxStatus>
        <f:facet name="start"><h:graphicImage value="progress.gif" /></f:facet>
        <f:facet name="success"><h:outputText value="" /></f:facet>
        <f:facet name="error">An error has occurred!</f:facet>
    </p:ajaxStatus>
    

    如果您想在标准 JSF 上拦截 &lt;f:ajax&gt;,请改用 &lt;f:ajax onevent&gt;

    <h:commandButton>
        <f:ajax onevent="progressListener" />
    </h:commandButton>
    <img id="progress" src="progress.gif" style="display:none" />
    

    使用这个 JavaScript 函数:

    function progressListener(data) {
        document.getElementById("progress").style.display = (status == "begin") ? "block" : "none";
    }
    

    【讨论】:

    • 你这么说很有趣,因为这正是我所拥有的。虽然这适用于过滤和 ajax 事件,但当我执行 mysql 查询时它根本不会移动。
    • 也许您按下了Esc 或浏览器中的某些组合键,它会停止所有动画 gif。或者在p:ajaxStatus 的情况下,它根本不是一个ajax 请求。
    • 这不是一个 ajax 请求。如果你还记得的话,这让我回到了整个 Excel 问题。我的行为必须是错误的,因为我必须让用户下载文件。 xls 文件是使用 JXL 和 Mysql 动态生成的。我将如何解决这个问题?非常感谢您的帮助。
    • 我开始意识到你只剩下停止进度 gif 的问题了。在这种情况下,除了将文件存储在磁盘上的临时位置并在(ajax!)bean 操作完成时有条件地在该 URL 上呈现 &lt;script&gt;window.open()&lt;/script&gt; 之外,我没有看到其他选择。
    • 使用 servlet,您可以完全控制自己的 File。您可以在将最后一个字节写入响应后删除它。在您的新情况下,您还可以考虑将文件句柄存储在会话范围内的某个映射或对象中,然后在会话被销毁时使用HttpSessionListenerHttpSessionBindingListener 删除文件。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-26
    • 1970-01-01
    • 1970-01-01
    • 2012-08-05
    • 1970-01-01
    相关资源
    最近更新 更多