Есть ли способ в jsf / primeface скачать файл, а затем изменить страницу? - PullRequest
0 голосов
/ 07 января 2019

Я использую Primefaces в проекте JSF. Мне нужно реализовать два действия по клику пользователя: - Скачать файл - сделать обратное действие, затем изменить страницу

Я пробовал несколько вещей, но ничего не работает, я могу загрузить файл или я могу выполнить фоновую обработку и изменить страницу, но не два действия вместе

Я попробовал этот кусок кода:

<p:commandButton id="exportEventLogButton" value="#{msg['avoir.creer']}" ajax="false" title="Export Log" onclick="PrimeFaces.monitorDownload(start, null)">
    <p:fileDownload value="#{avoirMB.download()}"/>
</p:commandButton>
<p:remoteCommand name="start" update="@this" action="#{avoirMB.saveAvoirTotalSsRefac}" />

Может ли кто-нибудь помочь мне выполнить действия в правильном порядке или с правильным кодом? Спасибо

1 Ответ

0 голосов
/ 08 января 2019

Вы правы. Реализация p:remoteCommand, по-видимому, не поддерживает перенаправление страниц, если установлено для атрибута action="". Я попробовал несколько разных вариантов, и мне это совсем не нравится.

Решение состоит в том, чтобы программно перенаправить, когда JSF и p:remoteCommand вызывают обратный вызов действия (это проверено с Lombok и PrimeFaces 6.2);

<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html"
  xmlns:p="http://primefaces.org/ui">
<h:head>
            <title>Test</title>
</h:head>
<h:body>
    <h:form>
        <p:remoteCommand process="@this"  action="#{downloadBackingBean.onCompleted}" name="stop" />
        <p:commandButton value="Download" ajax="false" onclick="PrimeFaces.monitorDownload(null, stop);" action="#{downloadBackingBean.onStarted}">
            <p:fileDownload value="#{downloadBackingBean.image}" />
        </p:commandButton>
    </h:form>
</h:body>

@Data
@Named
@RequestScoped
public class DownloadBackingBean {
    private StreamedContent image;

    public void onStarted() {
        System.out.println("download started");
    }

    public void onCompleted() throws IOException {
        System.out.println("download completed");
        FacesContext.getCurrentInstance().getExternalContext().redirect("newpage");
    }
}

Это решение вызовет первое действие компонента поддержки при нажатии кнопки загрузки и перенаправит на новую страницу, как только загрузка будет завершена.

Обратите внимание, что в этом коде предполагается, что image установлен на что-то. Ради простоты я решил опустить это здесь.

Альтернативный метод с использованием window.location

Как обсуждалось в комментариях, в зависимости от ваших требований, вы также можете просто установить window.location.href сразу после завершения, например,

<p:commandButton value="Download" ajax="false" 
    onclick="PrimeFaces.monitorDownload(null, function() { window.location.href='newpage';});"
    action="#{downloadBackingBean.onStarted}">

Это полностью устраняет необходимость в обратном вызове p:remoteCommand и onCompleted на стороне сервера, если он вам не нужен.

...