5

CSVファイルのダウンロード方法がわかりません。CSVは実行時に生成されます。最初にファイルをtomcatWEB-INFディレクトリに保存する必要がありますか?JSF1.2を使用しています。

ちなみに、この種のタスクで好まれるJSFコンポーネントは何ですか?


編集(05.05.2012-15:53)

BalusC彼の最初のリンクに記載されている解決策を試しましたが、コマンドボタンをクリックすると、ファイルの内容がWebページに表示されます。たぶん?に問題がありmimetypeますか?

xhtmlファイル:

<a4j:form>
    <a4j:commandButton action="#{surveyEvaluationBean.doDataExport}" value="#{msg.srvExportButton}" />
</a4j:form>

メインビーン:

    public String doDataExport() {

    try {
        export.downloadFile();  
    } catch (SurveyException e) {
        hasErrors = true;
    }
    return "";
}

export-bean:

public void downloadFile() throws SurveyException {

    try {

        String filename = "analysis.csv";

        FacesContext fc = FacesContext.getCurrentInstance();
        HttpServletResponse response = (HttpServletResponse) fc.getExternalContext().getResponse();

        response.reset();
        response.setContentType("text/comma-separated-values");
        response.setHeader("Content-Disposition", "attachment; filename=\"" + filename + "\"");

        OutputStream output = response.getOutputStream();

        // writing just sample data
        List<String> strings = new ArrayList<String>();

        strings.add("filename" + ";" + "description" + "\n");
        strings.add(filename + ";" + "this is just a test" + "\n");

        for (String s : strings) {
            output.write(s.getBytes());
        }

        output.flush();
        output.close();

        fc.responseComplete();

    } catch (IOException e) {
        throw new SurveyException("an error occurred");
    }
}

編集(2012年5月5日-16:27)

私は自分の問題を解決しました。<h:commandButton>代わりに使用する必要が<a4j:commandButton>あり、今では機能します!

4

2 に答える 2

4

最初にファイルをtomcatWEB-INFディレクトリに保存する必要がありますか?

ExternalContext#getResponseOutputStream()いいえ、ブラウザに何を取得するかを指示する適切な応答ヘッダーを設定した後、取得したHTTP応答本文に直接書き込みます。

次の回答にある具体的な例に基づいて計算を行います。

基本的に:

List<List<Object>> csv = createItSomehow();
writeCsv(csv, ';', ec.getResponseOutputStream());

ちなみに、この種のタスクでお気に入りのjsfコンポーネントは何ですか?

これは主観的なものです。しかしとにかく、私たちは<p:dataExporter>完全に満足するために使用しています。

于 2012-05-04T16:16:59.753 に答える
0

JSF 2を使用している場合は、primefacesを使用できます。あなたはそのリンク
を見ることができます。

そうでない場合は、次のように行うことができます。

List<Object> report = new ArrayList<Object>(); // fill your arraylist with relevant data 
String filename = "report.csv";    
File file = new File(filename);
Writer output = new BufferedWriter(new FileWriter(file));
output.append("Column1");
output.append(",");
output.append("Column2");
output.append("\n");
//your data goes here, Replcae Object with your bean
for (Object row:report){
    output.append(row.field1);
    output.append(",");
    output.append(row.field2);
    output.append("\n");
}
output.flush();
output.close();
于 2012-05-04T15:33:20.660 に答える