Frage an java, download, jsf, csv – Herunterladen einer CSV-Datei mit JSF

5

Ich kann keine CSV-Datei herunterladen. Die CSV wird zur Laufzeit generiert. Muss ich die Datei zuerst im tomcat WEB-INF-Verzeichnis speichern? Ich benutze JSF 1.2.

Übrigens, was ist die bevorzugte JSF-Komponente für diese Art von Aufgabe?

Bearbeiten (05.05.2012 - 15:53)

Ich habe die Lösung ausprobiertBalusC in seinem ersten angegebenVerknüpfung, aber wenn ich auf meinen CommandButton klicke, wird der Inhalt der Datei auf der Webseite angezeigt. Vielleicht gibt es ein Problem mit demmimetype?

xhtml-Datei:

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

Hauptbohne:

<code>    public String doDataExport() {

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

Export-Bohne:

<code>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");
    }
}
</code>

Bearbeiten (05.05.2012 - 16:27)

Ich habe mein Problem gelöst. Ich muss benutzen<h:commandButton> anstatt<a4j:commandButton> und jetzt klappt es!

Deine Antwort

2   die antwort
4

Muss ich die Datei zuerst im tomcat WEB-INF-Verzeichnis speichern?

Nein, schreiben Sie es einfach direkt in den HTTP-Antworttext, den Sie von erhaltenExternalContext#getResponseOutputStream() Nachdem Sie die richtigen Antwort-Header gesetzt haben, wird dem Browser mitgeteilt, was er abrufen wird.

Berechnen Sie anhand der konkreten Beispiele in den folgenden Antworten:

Wie kann ich einen Dateidownload von einer JSF-Backing-Bean bereitstellen?JSP-Generierung einer Excel-Tabelle (XLS) zum Herunterladen

Grundsätzlich gilt:

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

Übrigens, was ist die beliebteste jsf-Komponente für diese Art von Aufgabe?

Das ist subjektiv. Aber trotzdem benutzen wir<p:dataExporter> zur vollsten Zufriedenheit.

Bitte. In der Tat können Sie keine Dateien von Ajax herunterladen. Das ist auch schon im 1. Link erwähnt. BalusC
Ich glaube nicht, dass ich es gebrauchen kannPrimeFaces, weil sie JSF 1.2 seitdem nicht mehr unterstützenPrimeFaces 2.0 wann habe ich recht yves.beutler
Richtig, das alte JSF 1.x ist fast am Ende der Lebensdauer, daher sollten Sie keine Unterstützung für neue Komponentenbibliotheken erwarten. Fahren Sie einfach mit dem manuellen Streaming fort. Sie müssten nur die rohen greifenHttpServletResponse durchExternalContext#getResponse() und dann ruft seinegetOutputStream() stattdessen ist das aber schon im 1. link umrissen. Oder natürlich ein Upgrade auf JSF 2. Es bietet so viele Vorteile gegenüber JSF 1.2. BalusC
Ich kenne die Nachteile von jsf 1.2, aber im Moment sind wir nicht in der Lage, ein Upgrade auf ein höheres Level durchzuführen. Ich habe versucht, Ihren ersten Link zu verstehen, aber es funktioniert nicht. Ich habe den Mimetyp verwendettext/comma-separated-values Ich habe es im Web gefunden, aber die Browser (IE, FF, Chrome) interpretieren es nicht richtig. yves.beutler
Wenn ich benutzea4j:components dann klappt es nicht, aber jetzt habe ich umgestellt auf<h:commandButton> und es funktioniert einwandfrei. Vielen Dank an BalusC für eine weitere tolle Antwort! yves.beutler
0


Sie können sich das ansehenVerknüpfung.

Wenn nicht, kannst du es so machen:

<code>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();
</code>

Verwandte Fragen