2015-10-05 3 views
-1

Я пытаюсь экспортировать Результаты в Excel Foramt. Это кодgetOutputStream(), указав ошибку

public void createExcel1(){ 

      Statement stmt = null; 
      Connection conn = null; 

      try { 
       conn = (new CreateConnection()).getConnection(); 
       stmt = conn.createStatement(); 

       ResultSet rs = stmt.executeQuery("Select * form customer;"); 


       FacesContext facesContext = FacesContext.getCurrentInstance(); 
       ExternalContext externalContext = facesContext 
         .getExternalContext(); 


       HttpServletResponse response = (HttpServletResponse) externalContext.getResponse(); 
       response.reset(); 
       response.setContentType("application/vnd.ms-excel"); 
       response.setHeader("Content-Disposition", "attachment; filename=Customer.xls"); 
       HSSFWorkbook workbook = new HSSFWorkbook(); 
       HSSFSheet sheet = workbook.createSheet("Cust"); 


       HSSFRow rowhead = sheet.createRow((short) 0); 
       rowhead.createCell(0).setCellValue("ID"); 
       rowhead.createCell(1).setCellValue("Name"); 


       int i = 1; 
       while (rs.next()){ 
        HSSFRow row = sheet.createRow((short) i); 
        row.createCell(0).setCellValue(rs.getString("ID")); 
        row.createCell(1).setCellValue(rs.getString("Name")); 

        i++; 
       } 


       workbook.write(response.getOutputStream()); 

       response.flushBuffer(); 
       response.getOutputStream().flush(); 
       response.getOutputStream().close(); 



       } catch (SQLException e1) { 
        e1.printStackTrace(); 
       } catch (FileNotFoundException e1) { 
        e1.printStackTrace(); 
       } catch (IOException e1) { 
        e1.printStackTrace(); 
       }   

     } 

Это стеку `

SEVERE: Servlet.service() for servlet [Faces Servlet] in context with path [/Test1] threw exception [getOutputStream() has already been called for this response] with root cause 
java.lang.IllegalStateException: getOutputStream() has already been called for this response 
    at org.apache.catalina.connector.Response.getWriter(Response.java:636) 
    at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:213) 
    at com.sun.faces.context.ExternalContextImpl.getResponseOutputWriter(ExternalContextImpl.java:834) 
    at com.sun.faces.application.view.FaceletViewHandlingStrategy.createResponseWriter(FaceletViewHandlingStrategy.java:1177) 
    at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:398) 
    at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131) 
    at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:337) 
    at org.apache.myfaces.tomahawk.application.ResourceViewHandlerWrapper.renderView(ResourceViewHandlerWrapper.java:169) 
    at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:120) 
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) 
    at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:219) 
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:647) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
    at com.walmart.cdctraffic.utilities.ResponseHeaderFilter.doFilter(ResponseHeaderFilter.java:30) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:610) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1720) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1679) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    at java.lang.Thread.run(Unknown Source) 

Я прошел через все ответы, присутствующих в сети, но до сих пор я не могу исправить эту ошибку. Я также попытался перенаправить ответ, но это также вызывает некоторую ошибку. Прошу помощи .. !!

+1

Удивительная догадка - вы дважды вызываете 'getOutputStream' в свой код ... один, а затем смываете, а другой закрываете. – Tirath

+1

Ошибка кажется довольно понятной: «getOutputStream() уже вызван для этого ответа». Это означает, что вам не разрешено вызывать 'response.getOutputStream()' более одного раза. – RealSkeptic

+0

Дело в том, что вы вручную закрыли поток, но ваш JSF все еще пытается его использовать. Поскольку вы используете JSF для рендеринга страницы, попробуйте удалить «response.getOutputStream(). Close();» line, и пусть JSF закроет поток для вас. – javatutorial

ответ

0

Решение этой проблемы заключается в том, что я должен добавить

facesContext.responseComplete();

после response.getOutputStream(). Flush(); и мне пришлось удалить * response.getOutputStream(). Close(); **