Jsf 2 下载文件后更新组件

Jsf 2 下载文件后更新组件,jsf-2,primefaces,download,Jsf 2,Primefaces,Download,我使用Primefaces选项卡视图、CommandButton和FileDownload下载日志文件。下载日志文件后,我想提供从服务器上删除日志内容的选项 最初,“删除日志文件”按钮(deleteEventLogButton)被禁用,并有一个自定义标题,说明“删除日志-需要导出”。导出日志后,应启用按钮,标题应注明“删除日志” 我遇到的问题是,即使导出事件成功完成,删除日志文件按钮仍处于禁用状态,标题仍为“删除日志-需要导出” 我猜exportEventLogButton->Update=“d

我使用Primefaces选项卡视图、CommandButton和FileDownload下载日志文件。下载日志文件后,我想提供从服务器上删除日志内容的选项

最初,“删除日志文件”按钮(deleteEventLogButton)被禁用,并有一个自定义标题,说明“删除日志-需要导出”。导出日志后,应启用按钮,标题应注明“删除日志”

我遇到的问题是,即使导出事件成功完成,删除日志文件按钮仍处于禁用状态,标题仍为“删除日志-需要导出”

我猜exportEventLogButton->Update=“deleteEventLogButton”在文件下载值之前被调用

导出日志后,我可以点击“F5”并刷新页面,此时deleteEventLogButton已启用,显示正确的标题

JSF-Snippet

<p:tabView id="logView">
    <p:tab id="eventLogTab" title="Security Events">
        <p:panelGrid ...>

            <p:commandButton id="exportEventLogButton" icon="ui-icon-disk" styleClass="c25" ajax="false" title="Export Log" disabled="#{empty managedCmsLogsBean.eventLogEntityList}" update="deleteEventLogButton">
                <p:fileDownload value="#{managedCmsLogsBean.exportEventLogFiles()}"/>
            </p:commandButton>

            <p:commandButton id="deleteEventLogButton" icon="ui-icon-trash" styleClass="c25" ajax="false" title="#{managedCmsLogsBean.deleteEventLogCaption}" disabled="#{! managedCmsLogsBean.eventLogExported}" action="#{managedCmsLogsBean.clearEventLogs()}" update="eventLogTab" />    

        </p:panelGrid>

        <p:dataTable value="#{managedCmsLogsBean.eventLogEntityList}" ...>
            ...
        </p:dataTable>

    </p:tab>
</p:tabView>
我尝试将更新事件移动到FileDownload中,但没有任何区别

<p:commandButton id="exportEventLogButton" icon="ui-icon-disk" styleClass="c25" ajax="false" title="Export Log" disabled="#{empty managedCmsLogsBean.eventLogEntityList}">
    <p:fileDownload value="#{managedCmsLogsBean.exportEventLogFiles()}">
        <p:ajax update="deleteEventLogButton"/>
    </p:fileDownload>
</p:commandButton>

我已经搜索了几天了,发现了许多与此非常接近的问题。。。但是没有一个有帮助(


我只是想说清楚…我在导出方面没有问题。问题是在导出完成后,删除日志文件按钮没有启用。

您是否尝试过将eventLogExported/isEventLogExported从布尔值更改为布尔值或字符串?

p:commandButton
在您的情况下是(必须是)非AJAX按钮(通过添加
AJAX=“false”
属性设置)。在这种情况下,
update
属性和
p:AJAX
标记没有任何意义(因为它们仅用于AJAX请求)。当您下载文件时,您的应用程序会发送某种类型的流媒体,并且您会看到“保存文件”对话框。您的页面不会刷新。因此,您必须使用
PrimeFaces.monitorDownload
来执行此操作:

<p:commandButton id="exportEventLogButton" 
                 icon="ui-icon-disk" 
                 styleClass="c25" 
                 ajax="false" 
                 title="Export Log" 
                 disabled="#{empty managedCmsLogsBean.eventLogEntityList}"
                 onclick="PrimeFaces.monitorDownload(null, stop)">

并添加停止功能,该功能将更新第二个按钮:

<p:remoteCommand name="stop" update="deleteEventLogButton"/>

正如在()中所回答的,我们不能从一个请求中得到两次响应,要在下载后刷新页面,最好在下载链接(p:commandbutton)onclick标记中使用以下java脚本

例如:

<p:commandButton ajax="false" icon="ui-icon-arrowstop-1-s" onclick="setTimeout('location.reload();', 1000);" action="#{managedBean.downloadMethod}" />


这将在1秒后自动刷新页面,同时,即在刷新之前,您将获得下载文件,根据您的下载响应时间,增加该脚本中的秒数。秒数不应小于该下载响应时间。

我现在有了…但没有任何区别。感谢您的支持建议。太棒了!这个网站运行得很好。我喜欢这个网站…这是因为像你这样的人!因为你是新手,如果这有助于你接受回答谢谢!!它对我也很有效,在我的情况下,我必须将ajax=“true”与
<p:commandButton ajax="false" icon="ui-icon-arrowstop-1-s" onclick="setTimeout('location.reload();', 1000);" action="#{managedBean.downloadMethod}" />