Ich weiß nicht, wie Sie eine 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.Herunterladen einer CSV-Datei mit JSF
Übrigens, was ist die bevorzugte JSF-Komponente für diese Art von Aufgabe?
Edit (05.05.2012 - 15.53)
habe ich versucht, die Lösung BalusC
erklärte in seinem ersten link, aber wenn ich den Inhalt der Datei auf meinem Befehlsschaltfläche klicken Sie auf der Webseite angezeigt. Vielleicht gibt es ein Problem mit der mimetype
?
xhtml-Datei:
<a4j:form>
<a4j:commandButton action="#{surveyEvaluationBean.doDataExport}" value="#{msg.srvExportButton}" />
</a4j:form>
Haupt Bohne:
public String doDataExport() {
try {
export.downloadFile();
} catch (SurveyException e) {
hasErrors = true;
}
return "";
}
Export-Bohne:
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");
}
}
Edit (05.05.2012 - 16.27)
Ich löste mein Problem. Ich muss <h:commandButton>
statt <a4j:commandButton>
verwenden und jetzt funktioniert es!
Ich glaube nicht, dass ich 'PrimeFaces' verwenden kann, weil sie JSF 1.2 seit' PrimeFaces 2.0' nicht unterstützen, wenn ich recht habe? –
Das ist richtig, das alte JSF 1.x ist kurz vor dem Ende des Lebens, also sollten Sie keine neue Unterstützung für Komponentenbibliotheken erwarten. Mach einfach weiter und streame es manuell. Sie müssten nur die rohe 'HttpServletResponse' von' ExternalContext # getResponse() 'holen und dann stattdessen 'getOutputStream()' aufrufen, aber das ist bereits im 1. Link beschrieben. 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 können wir nicht auf ein höheres Level upgraden. Ich habe versucht, deinen ersten Link zu verstehen, aber es funktioniert nicht. Ich habe den MIME-Typ 'text/comma-separated-values' verwendet, den ich im Internet gefunden habe, aber die Browser (IE, FF, Chrome) interpretieren ihn nicht korrekt. –