2012-05-04 4 views
5

Я не знаю, как загрузить CSV-файл. CSV будет сформирован во время выполнения. Нужно ли сначала сохранить файл в каталоге tomcat WEB-INF? Я использую JSF 1.2.Загрузка CSV-файла с использованием JSF

Кстати, какой предпочтительный компонент JSF для такого рода задач?


Edit (05.05.2012 - 15:53)

Я попробовал решение BalusC заявил в своем первом link, но если я нажимаю на моем CommandButton содержимое файла отображается на веб-странице. Может быть, проблема с 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 ""; 
} 

экспорт фасоли:

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)

Я решил свою проблему. Я должен использовать <h:commandButton> вместо <a4j:commandButton>, и теперь он работает!

ответ

4

мне нужно сохранить файл в TOMCAT WEB-INF каталога первый ли?

Нет, просто написать его прямо в тело ответа HTTP, как вы получите от ExternalContext#getResponseOutputStream() после установить правильные заголовки ответа, который указывает браузеру, что он собирается получить.

Посчитайте на основе конкретных примеров, найденных в следующих ответов:

В основном:

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

Кстати, какой любимый jsf-компонент для такого рода задач?

Это субъективно. Но в любом случае мы используем <p:dataExporter> для полного удовлетворения.

+0

Я не думаю, что я могу использовать 'PrimeFaces', потому что они не поддерживают JSF 1.2 с' PrimeFaces 2.0', когда я прав? –

+1

Правильно, древний JSF 1.x близок к концу жизни, поэтому вы не должны ожидать поддержки новой библиотеки компонентов. Просто продолжайте его вручную. Вам нужно будет только захватить необработанный «HttpServletResponse» с помощью 'ExternalContext # getResponse()', а затем вызывать его 'getOutputStream()', но это уже указано в 1-й ссылке. Или, конечно, перейти на JSF 2. Он предлагает так много преимуществ перед JSF 1.2. – BalusC

+0

Я знаю недостатки jsf 1.2, но на данный момент мы не можем перейти на более высокий уровень. Я попытался понять вашу первую ссылку, но она не работает. Я использовал mimetype 'text/comma-separated-values', которые я нашел в Интернете, но браузеры (IE, FF, Chrome) не интерпретируют его правильно. –

0

Если вы используете JSF 2, вы можете использовать простые шрифты.
Вы можете посмотреть, что link.

Если вы не можете это сделать так:

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(); 
Смежные вопросы