2012-03-16 190 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