2012-05-04 24 views
5

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!

Odpowiedz

4

Czy muszę zapisać plik w tomcat pierwszego katalogu WEB-INF?

Nie, po prostu napisać go prosto do korpusu odpowiedzi HTTP, jak uzyskać przez ExternalContext#getResponseOutputStream() Po ustawieniu odpowiednich nagłówków odpowiedzi, która informuje przeglądarkę, co to będzie odzyskać.

Czy matematyki w oparciu o konkretne przykłady znajdują się w następujących odpowiedzi:

zasadniczo:

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

Przy okazji, jaki jest ulubiony komponent jsf do tego rodzaju zadań?

To jest subiektywne. Ale w każdym razie, używamy <p:dataExporter> do pełnej satysfakcji.

+0

Nie sądzę, że mogę używać 'PrimeFaces', ponieważ nie obsługują JSF 1.2 od czasów' PrimeFaces 2.0' kiedy mam rację? –

+1

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

+0

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. –

0

Jeśli używasz JSF 2, możesz użyć priorytetów.
Możesz spojrzeć na to link.

Jeśli nie można zrobić tak:

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(); 
Powiązane problemy