jsf primefaces обновляет значение индикатора выполнения во время работы метода действия

У меня есть кнопка отправки внизу моей JSF-страницы, которая передает все входные данные (тексты, файлы и т. д.) в базу данных и на сервер. Из-за продолжительности этого действия я хочу показать пользователю ход операции и по окончании перенаправить его на финишный сайт.

Мой боб выглядит так:

<h:form enctype="multipart/form-data">
    <p:commandButton widgetVar="submitButton" value="Save to DB" action="#{bean.submit}" onclick="PF('submitButton').disable();" />
    <p:progressBar widgetVar="pbAjax" ajax="true" value="#{bean.saveProgress}" interval="1000" labelTemplate="{value}%" styleClass="animated" />            
</h:form>

и мой код:

private int saveProgress;

public String submit(){
    for(int i = 0; i < 100; i++){ //dummy values
        //DB operations
        //file uploads
        saveProgress = i;
        System.out.println("Progress: " + saveProgress);
    }

    return "finished.xhtml";
}

//getter for saveProgress

Проблема заключается в том, что ни обновления индикатора выполнения, ни страницы не переходят на файл done.xhtml после завершения.

Что я здесь не так делаю? это проблема потока (потому что submit не является потокобезопасным?) Как я могу решить эту проблему?

4 голоса | спросил Niko 31 MarpmMon, 31 Mar 2014 12:33:18 +04002014-03-31T12:33:18+04:0012 2014, 12:33:18

1 ответ


0

это решение (с использованием async) является хаком, но оно работает:

<p:commandButton id="executeButton" action="#{myBean.longOperation}"
    async="true" process="@form" value="start import"
    onclick="progress.start()" global="false" />

<br />

<p:progressBar ajax="true" widgetVar="progress" value="#{myBean.progress}"
    labelTemplate="{value}%" styleClass="animated" global="false" />

<br />

<p:outputPanel id="result" autoUpdate="true">
    <h:outputText value="#{myBean.message}" />
</p:outputPanel>

с этим видом бобов

@ManagedBean
@ViewScoped
public class MyBean implements Serializable
{
    private static final long serialVersionUID = 1L;

    private double progress = 0d;
    private String message = "ready";

    public String longOperation() throws InstantiationException, IllegalAccessException
    {
        for(int i = 0; i < 100; i++)
        {
            // simulate a heavy operation
            progress++;
            message = "processing [" + i + "]";
            Thread.sleep(1000);
        }

        message = "completed";

        return "result";
    }

    public double getProgress()
    {
        return progress;
    }

    public void setProgress(double progress)
    {
        this.progress = progress;
    }

    public String getMessage()
    {
        return message;
    }

    public void setMessage(String message)
    {
        this.message = message;
    }
}
ответил Michele Mariotti 31 MarpmMon, 31 Mar 2014 12:52:55 +04002014-03-31T12:52:55+04:0012 2014, 12:52:55

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132