首页 > 解决方案 > 素面。在下载文件之前使用 ajax 验证

问题描述

在我的一个应用程序中,我有几个按钮可以执行以下操作:a)发送非 ajax 调用以下载文件 b)服务器进行一些验证 c)如果验证通过,则生成并下载文件 d)如果验证失败,然后显示错误消息。

该按钮可能看起来像这样(我不使用 p:fileDownload 因为它是一个继承的项目,但如果需要我可以使用它)

        <p:commandLink styleClass="btn" id="botonExcel"
            title="#{text['label.generar.excel']}"
            action="#{incidenciasCuentasPagosAction.descargaExcelSeguimiento}" update=":messages" ajax="false"
            rendered="#{not empty incidenciasCuentasPagosAction.existenIncidencias}">
            <span class="hab-icon-24 hab-icon-excel"></span>
            <span class="hab-button-text">#{text['label.generar.excel']}</span>
        </p:commandLink> 

它工作正常,但我有一个问题。由于调用是非ajax的,所以整个页面都被重新加载了,这有点烦人。例如,它移动到页面顶部。

我想做什么:

  1. 进行 AJAX 调用以验证生成的 de 文件
  2. 如果有错误,显示消息
  3. 如果一切正常,请对 donwload de File 进行非 AJAX 调用

问题是我不知道如何在验证通过后触发非 AJAX 调用。我知道如何使用 <p:remoteCommand> 进行 AJAX 调用,但它只允许 AJAX。我知道的唯一解决方法是使用隐藏按钮并单击它,但我发现它是一个 hack,所以我更喜欢另一种解决方案。

标签: ajaxvalidationjsfprimefacesdownload

解决方案


您可以创建一个 servlet 来提供下载。这将使您在 bean 操作中发送 JavaScript 位置更改:

if (success) {
  PrimeFaces.current().executeScript("document.location.href = 'SERVLET_URI'");
}
else {
  // Set error message
}

推荐阅读