2012-01-24 6 views
1

JSF 2アプリケーションのページにファイルをダウンロードするリンクを表示する必要があります。今、問題は、ファイルが、作成時にデータベースへの新鮮な外観に依存するデータを含んでいることです。しかし、私がしたいのは、それを作成し、ユーザーに1つのアクションでそれをダウンロードするリンクを与えることです。アクションリンクと1つのリンクをダウンロード

これは、ファイルを生成するためのボタンと、生成されたファイルをダウンロードするためのリンクで置き換えるという2つのアクションで非常に簡単です。

これはもう一度commandLinkのワンクリックで行うことができますか?

EDIT、下記のBalusCのコメントに従ってください。ここでは私がやろうとしていることの詳細を、これまで行ってきました。私はxhtmlでこれを持っています:

<h:panelGroup rendered="#{!bean.showLinkToExcelFile()}"> 
    <h:form> 
     <td><h:commandButton value="Generate list of your Bids for download" action="#{bean.createBidsList()}"/></td>  
    </h:form> 
</h:panelGroup> 
<h:panelGroup rendered="#{bean.showLinkToExcelFile()}"> 
    <td><a href="#{bean.findBidsListFileName()}">Download Your Bids</a></td> 
</h:panelGroup> 

これは機能します。このボタンは、Excelファイルを作成して場所に保存し、データベース内のファイル名を更新します。次に、リンクがファイルを提供します。しかし、それはユーザーのための2つのステップのプロセスです。私がそれが欲しいのはただの一歩です。例えば一つのリンク、そのよう:

<a href="#{bean.findBidsListFileName()}">Download Your Bids</a> 

または、最も可能性の高い、JSFのcommandLinkは、バックエンド上のファイル/リソース/場所に保存し、かつシームレスに「保存」ダイアログを開き、Excelを作成します。ユーザのマシン上で実行されます。

+0

答えは:はい。より多くの質問がありますか?必要に応じて要件を実装している間に、正確にどこに詰まっているのかを示して詳細を述べてください。 – BalusC

+0

ありがとう、BalusC。私はその質問を編集した。 – Herzog

答えて

5

ローカルディスクファイルシステムのOutputStreamではなく、HTTP応答のOutputStreamにすぐにレポートを書き込ませることができます。

は、ここでは、Excelレポートを作成するために、Apache POIを使用していると仮定して、基本的な例です:

public void createAndDownloadBidsReport() throws IOException { 
    // Prepare Excel report to be downloaded. 
    HSSFWorkbook bidsReport = createBidsReportSomehow(); 
    String filename = "bids.xls"; 

    // Prepare response to show a Save As dialogue with Excel report. 
    FacesContext facesContext = FacesContext.getCurrentInstance(); 
    ExternalContext externalContext = facesContext.getExternalContext(); 
    externalContext.setResponseContentType("application/vnd.ms-excel"); 
    externalContext.setResponseHeader("Content-Disposition", "attachment; filename=\"" + filename + "\""); 

    // Write Excel report to response body. 
    bidsReport.write(externalContext.getResponseOutputStream()); 

    // Inform JSF that response is completed and it thus doesn't have to navigate. 
    facesContext.responseComplete(); 
} 

あなただけの単一コマンドリンク(またはボタン)で終わることができますこの方法です。

<h:form> 
    <h:commandLink value="Create and download bids report" action="#{bean.createAndDownloadBidsReport}" /> 
</h:form> 

これはディスクファイルシステムには保存されません。 本当ににコピーが必要な場合は、別のbidsReport.write()行を追加して、必要なディスクファイルシステムの場所に書き込む必要があります。

+1

私は実際にjxlを使用していますが、これは関係なく動作します。綺麗な。 – Herzog

+0

よろしくお願いします。 – BalusC

+0

BalusC、私はバグの何かで質問を編集しました。それが現在の質問に無関係になったら、私はそれを削除します。ありがとう。 – Herzog

0

通常のダウンロードリンクを使用して、そのURLをその場で文書を生成するサーブレットにマップします。

関連する問題