我不知道如何下载CSV文件。 CSV将在运行时生成。我是否需要先将文件保存在tomcat WEB-INF目录中?我正在使用JSF 1.2。
顺便说一下,这类任务最受欢迎的JSF组件是什么?
编辑(05.05.2012 - 15:53)
我尝试了他的第一个link中所述的解决方案BalusC
,但如果我点击我的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");
}
}
编辑(05.05.2012 - 16:27)
我解决了我的问题。我必须使用<h:commandButton>
代替<a4j:commandButton>
,现在它可以使用了!
答案 0 :(得分:4)
我是否需要先将文件保存在tomcat WEB-INF目录中?
不,只需在设置了适当的响应标头后通过ExternalContext#getResponseOutputStream()
直接写入HTTP响应主体,告诉浏览器它将检索它。
根据以下答案中的具体示例进行数学计算:
基本上:
List<List<Object>> csv = createItSomehow();
writeCsv(csv, ';', ec.getResponseOutputStream());
顺便说一下,这类任务最喜欢的jsf组件是什么?
这是主观的。但无论如何,我们正在使用<p:dataExporter>
来完全满意。
答案 1 :(得分:0)
如果您使用的是JSF 2,则可以使用primefaces。
您可以查看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();