2012-03-16 597 views
1

我试图让我的JSF导出电子表格以供下载。我正在使用Apache的POI库来编写Excel文档。我得到以下错误在一个警告框当代码运行:XSSFWorkbook#write()导致空响应

emptyResponse: An empty response was received from the server. 

的方法,生成所述电子表格,并导出到的OutputStream低于(I重命名的类中,为了简单起见,方法等)。

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

如果它有所作为,我在调用此方法的表单submit上使用AJAX(标记)。 – 2012-03-16 16:11:21

回答

3

如果它有所作为,我在调用此方法的表单submit上使用AJAX(<f:ajax>标记)。

它绝对不同。您可以通过Ajax下载文件而不是。 Ajax由JavaScript代码执行。但是JavaScript没有设施来强制对话或执行与文件的MIME类型相关的平台默认应用程序(幸运的是,这将是一个主要的安全/入侵问题)。此外,JSF Ajax API期望指定结构中的XML响应符合JSF规范。当您发送完整的Excel文件时,整个Ajax响应将被JSF Ajax API忽略为不可理解的垃圾。

您需要发送一个正常的同步请求。从命令链接/按钮中删除<f:ajax>标记。如果下载以attachment发送,则当前页面将保持不变。

+0

如果没有Ajax调用,验证器是否仍照常启动? – 2012-03-16 16:34:34

+1

他们肯定会的。只要你使用JSF提供的验证API。 – BalusC 2012-03-16 16:38:36

+0

太棒了,谢谢。删除AJAX呼叫解决了问题。 – 2012-03-16 16:42:38