Nie wiem, jak pobrać plik CSV. Plik CSV zostanie wygenerowany w czasie wykonywania. Czy muszę najpierw zapisać plik w katalogu tomcat WEB-INF? Używam JSF 1.2.Pobieranie pliku CSV przy użyciu JSF
Nawiasem mówiąc, jaki jest preferowany komponent JSF do tego rodzaju zadań?
Edit (05.05.2012 - 15:53)
Próbowałem rozwiązanie BalusC
stwierdzono w jego pierwszym link, ale jeśli kliknę na moim CommandButton zawartość pliku jest wyświetlana na stronie. Może jest jakiś problem z mimetype
?
xhtml-file:
<a4j:form>
<a4j:commandButton action="#{surveyEvaluationBean.doDataExport}" value="#{msg.srvExportButton}" />
</a4j:form>
głównym fasola:
public String doDataExport() {
try {
export.downloadFile();
} catch (SurveyException e) {
hasErrors = true;
}
return "";
}
eksport fasola:
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)
Rozwiązałem mój problem. Muszę użyć <h:commandButton>
zamiast <a4j:commandButton>
i teraz to działa!
Nie sądzę, że mogę używać 'PrimeFaces', ponieważ nie obsługują JSF 1.2 od czasów' PrimeFaces 2.0' kiedy mam rację? –
To prawda, starożytny JSF 1.x jest bliski końca życia, więc nie powinieneś oczekiwać obsługi nowej biblioteki komponentów. Po prostu przesyłaj strumieniowo ręcznie. Wystarczy pobrać surową 'HttpServletResponse' przez' ExternalContext # getResponse() ', a następnie wywołać jego' getOutputStream() ', ale to już jest opisane w 1. linku. Lub, oczywiście, upgrade do JSF 2. Oferuje tak wiele zalet w stosunku do JSF 1.2. – BalusC
Znam wady jsf 1.2, ale w tej chwili nie jesteśmy w stanie przejść na wyższy poziom. Próbowałem zrozumieć twój pierwszy link, ale to nie działa. Użyłem typu MIME "text/comma-separated-values", które znalazłem w Internecie, ale przeglądarki (IE, FF, Chrome) nie interpretują tego poprawnie. –