Java getOutputStream()引发错误
我正在尝试将结果集导出到Excel for MT。这是密码Java getOutputStream()引发错误,java,apache-poi,resultset,Java,Apache Poi,Resultset,我正在尝试将结果集导出到Excel for MT。这是密码 public void createExcel1(){ Statement stmt = null; Connection conn = null; try { conn = (new CreateConnection()).getConnection(); stmt = conn.createSt
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();
}
}
这是堆栈
`
我已经浏览了网上的所有答案,但仍然无法纠正这个错误。我也尝试重定向响应,但这也引发了一些错误。
请帮忙 这个问题的解决办法是我必须补充 facesContext.responseComplete()
在响应之后。getOutputStream().flush()并且我必须删除*response.getOutputStream().close()** 胡乱猜测-您在代码中调用了两次
getOutputStream
,一次是在刷新时,另一次是在关闭它。错误似乎是不言自明的:“此响应已经调用了getOutputStream()。这意味着您不允许多次调用response.getOutputStream()
。事实是您手动关闭了流,但您的JSF仍在尝试使用它。由于您使用JSF呈现页面,请尝试删除“response.getOutputStream().close();”行,然后让JSF为您关闭流。我尝试删除“response.getOutputStream().close();”,但它也会抛出相同的错误。
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)