14

Primefaces TabView、CommandButton、および FileDownload を使用してログ ファイルをダウンロードしています。ログ ファイルがダウンロードされたら、ログの内容をサーバーから削除するオプションを提供したいと考えています。

最初は、[ログ ファイルの削除] ボタン (deleteEventLogButton) は無効になっており、「ログの削除 - エクスポートが必要です」というカスタム キャプションがあります。ログがエクスポートされると、ボタンが有効になり、キャプションに「ログの削除」と表示されます。

私が抱えている問題は、[ログ ファイルの削除] ボタンがまだ無効になっていて、エクスポート イベントが正常に完了した後でも、キャプションに "ログの削除 - エクスポートが必要です" と表示されることです。

私の推測では、 fileDownload 値の前に exportEventLogButton->Update="deleteEventLogButton" が呼び出されています。

ログをエクスポートしたら、[F5] を押してページを更新すると、deleteEventLogButton が有効になり、正しいキャプションが表示されます。

JSF-スニペット

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

バッキング Bean - スニペット

private boolean eventLogExported;

public StreamedContent exportEventLogFiles() {
    eventLogExported = true;
    return logFileUtility.exportSecurityEventLog(eventLogEntityList, eventLogStartDate, eventLogStopDate);
}

public boolean isEventLogExported() {
    return eventLogExported;
}

public void setEventLogExported(boolean value) {
    eventLogExported = value;
}

public String getDeleteEventLogCaption() {
    return eventLogExported ? "Delete Logs" : "Delete Logs - Export Required";
}

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>

私は数日間検索しましたが、これに非常に近い多くの問題を見つけました...しかし、助けにはなりませんでした。:(

はっきりさせておきたいのですが、エクスポートに問題はありません。問題は、エクスポートの完了後に [ログ ファイルの削除] ボタンが有効にならないことです。

4

4 に答える 4

37

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

2番目のボタンを更新する停止機能を追加します:

<p:remoteCommand name="stop" update="deleteEventLogButton"/>
于 2013-04-01T14:23:54.417 に答える
4

Baluscが答えたように、質問(リビジョン)では、単一の要求から 2 回応答を取得できません。ダウンロード後にページを更新するには、ダウンロード リンク (p:commandbutton) の onclick タグで次の Java スクリプトを使用することをお勧めします。

例:

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

これにより、1 秒後にページが自動的に更新されます。同時に、更新前に、ダウンロード応答時間に基づいてダウンロード ファイルが取得され、そのスクリプトの秒数が増加します。秒数は、そのダウンロード応答時間よりも小さくてはなりません。

于 2015-04-09T05:22:10.750 に答える
0

eventLogExported/isEventLogExported を boolean から Boolean または String に変更してみましたか?

于 2013-04-01T14:16:04.963 に答える