2015-10-05 88 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();”行,并让JSF为你关闭流。 – javatutorial

回答

0

这个问题的解决方案是,我必须添加

facesContext.responseComplete();

response.getOutputStream()。flush();我不得不删除* response.getOutputStream()。close(); **