使用JSF下载CSV文件

我不知道如何下载CSV文件。 CSV将在运行时生成。 我是否需要先将文件保存在tomcat WEB-INF目录中? 我正在使用JSF 1.2。

顺便说一下,这种任务最受欢迎的JSF组件是什么?


编辑(05.05.2012 – 15:53)

我尝试了BalusC在他的第一个链接中说明的解决方案,但如果我点击我的commandButton,该文件的内容将显示在网页上。 也许mimetype存在问题?

XHTML文件:

    

主豆:

  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 strings = new ArrayList(); 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"); } } 

编辑(05.05.2012 – 16:27)

我解决了我的问题。 我必须使用而不是 ,现在它可以工作了!

我是否需要先将文件保存在tomcat WEB-INF目录中?

不,只需在通过ExternalContext#getResponseOutputStream()后直接将其写入HTTP响应主体,然后设置正确的响应标头,告诉浏览器它将检索什么。

根据以下答案中的具体示例进行数学计算:

  • 如何从JSF支持bean提供文件下载?
  • JSP生成Excel电子表格(XLS)下载

基本上:

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

顺便说一下,这类任务最喜欢的jsf组件是什么?

这是主观的。 但无论如何,我们正在使用来完全满意。

如果您使用的是JSF 2,则可以使用primefaces。
你可以看看那个链接 。

如果没有,你可以这样做:

 List report = new ArrayList(); // 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();