2012-03-16 3 views
1

다운로드 할 스프레드 시트를 내 JSF로 내보내려고합니다. Excel 문서 작성을 위해 Apache의 POI 라이브러리를 사용하고 있습니다.XSSFWorkbook # write() 결과가 비어 있습니다.

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(); 
} 

감사의 말에 감사드립니다. 내가 양식에 AJAX (<f:ajax> 태그)를 사용하고 그 차이를 만드는 경우

+0

차이가 있다면이 메소드를 호출하는 양식 제출에 AJAX ( 태그)를 사용하고 있습니다. –

답변

3

,이 메소드를 호출하는 제출합니다.

확실히 틀립니다. 아니, 다운로드 파일은 Ajax에서 다운로드 할 수 있습니다. Ajax는 JavaScript 코드에 의해 실행됩니다. 그러나 JavaScript에는 Save As 대화 상자를 강제 실행하거나 파일의 MIME 유형과 관련된 플랫폼 기본 응용 프로그램을 실행할 수있는 기능이 없습니다 (고맙게도 주요 보안/침입 문제 였을 것입니다). 또한 JSF Ajax API는 지정된 구조의 XML 응답이 JSF 스펙을 준수 할 것으로 기대합니다. 대신 완전한 Excel 파일을 보내면 Ajax 응답 전체가 JSF Ajax API에 의해 이해할 수없는 쓰레기로 무시됩니다.

정상적인 동기 요청을 보내야합니다. 명령 링크/버튼에서 <f:ajax> 태그를 제거하십시오. 다운로드가 attachment으로 전송되면 현재 페이지는 동일하게 유지됩니다.

+0

Ajax 호출없이 여전히 유효성 검사기가 정상적으로 실행됩니까? –

+1

분명히 그들은 그렇게 할 것입니다. JSF 제공 유효성 검사 API를 사용하는 한. – BalusC

+0

환상적입니다. 감사합니다. AJAX 호출을 제거하면 문제가 해결되었습니다. –

관련 문제