Реализация индикатора выполнения, представляющего активность данных mysql в JSF - PullRequest
1 голос
/ 04 марта 2011

Мой вопрос относится к индикатору выполнения Prime Faces, но любая реализация vanilla jsf (с использованием jquery) будет полезна. Моя проблема в том, что когда я запускаю длинный запрос MySQL, я также отображаю индикатор выполнения. Проблема в том, что он запускает процесс после завершения запроса данных. Я предполагаю, потому что фаза рендеринга не применяется до тех пор, пока не закончится вся работа с сервером. Нужно ли запускать индикатор выполнения в другом потоке?

Индикатор выполнения не обязательно должен показывать, где находится запрос (если это вообще возможно). Я действительно просто хочу показать приложение "мышление". Может быть, с текстом или анимированным GIF. Спасибо за любую помощь.

EDIT

Это то, что у меня есть.

     <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");
    }
}

1 Ответ

3 голосов
/ 04 марта 2011

Получите анимированный значок из http://ajaxload.info,, включите его на свою страницу с помощью CSS display: none; и используйте JS / jQuery, чтобы сделать его display: block; во время нажатия.

<h:commandButton onclick="$('#progress').show()" />

<img id="progress" src="progress.gif" style="display:none" />

Это, однако, прекрасно работает только с синхронными запросами. Поскольку вы используете PrimeFaces, я бы предложил вместо этого использовать p:ajaxStatus, поскольку он будет учитывать асинхронные (ajax) запросы.

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

Обновление : согласно вашему обновлению. <p:ajaxStatus> перехватывает только сгенерированные PrimeFaces запросы ajax. Так что на <p:commandButton> или <p:commandLink> без ajax="false" только.

...