我正在尝试让我的JSF导出电子表格以供下载。我正在使用Apache的POI库来编写Excel文档。代码运行时,我在警告框中收到以下错误:
emptyResponse: An empty response was received from the server.
生成电子表格并导出到OutputStream的方法如下(为简单起见,我已重命名了类,方法等)。
private void generateSpreadsheet(Object object) throws Exception {
FacesContext context = FacesContext.getCurrentInstance();
HttpServletResponse response = (HttpServletResponse)context.getExternalContext().getResponse();
String fileName = object.getProperty() + ".xlsx";
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-Disposition", "attachment;filename=\"" + fileName +"\"");
OutputStream os = response.getOutputStream();
Workbook wb = new XSSFWorkbook();
Sheet sheet = wb.createSheet("Sheet 1");
Row row = sheet.createRow(0);
Cell cell = row.createCell(0);
cell.setCellValue("test");
wb.write(os);
os.flush();
os.close();
FacesContext.getCurrentInstance().responseComplete();
}
非常感谢任何建议,谢谢。
答案 0 :(得分:3)
如果它有所不同,我在调用此方法的表单提交上使用AJAX(
<f:ajax>
标记)。
绝对不同。您可以通过Ajax 不下载文件。 Ajax由JavaScript代码执行。但JavaScript无法强制另存为对话框或执行与文件的mime类型相关联的平台默认应用程序(幸运的是,这可能是一个主要的安全/入侵问题)。此外,JSF Ajax API期望指定结构中的XML响应符合JSF规范。当您发送完整的Excel文件时,整个Ajax响应将被JSF Ajax API忽略为不可理解的垃圾。
您需要发送正常的同步请求。从命令链接/按钮中删除<f:ajax>
标记。如果下载以attachment
发送,则当前页面将保持不变。