请您先登录,才能继续操作
[Ajax4JSF] JSF导出文件异常getOutputStream() has already been called
freesky_zh
2009-03-04
使用Trinidad中的控件导出CSV文件
==========.xhtml======================================= ... <tr:commandButton icon="../images/csv.jpg" shortDesc="Export to CSV"> <tr:fileDownloadActionListener contentType="text/csv; charset=utf-8" filename="content.csv" method="#{backingBean.exportCsv}" /> </tr:commandButton> ... ========================== =========backingBean=================================== public final void sendContent(final FacesContext context, final OutputStream out, final UIXTable table) throws IOException { OutputStreamWriter outw = new OutputStreamWriter(out, "UTF-8"); Object rowKey = table.getRowKey(); for (int i = 0; i < table.getRowCount(); i++) { table.setRowIndex(i); if (!table.isRowAvailable()) { break; } exportRow(table, outw); } outw.flush(); table.setRowKey(rowKey); } ==================================== after exporting csv file, there is an error on console like this: ============================================================= SEVERE: Servlet.service() for servlet Spring Dispatcher Servlet threw exception java.lang.IllegalStateException: getOutputStream() has already been called for this response at org.apache.catalina.connector.Response.getWriter(Response.java:610) at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:198) at javax.servlet.ServletResponseWrapper.getWriter(ServletResponseWrapper.java:112) at javax.servlet.ServletResponseWrapper.getWriter(ServletResponseWrapper.java:112) at com.sun.facelets.FaceletViewHandler.createResponseWriter(FaceletViewHandler.java:400) at com.sun.facelets.FaceletViewHandler.renderView(FaceletViewHandler.java:557) at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:189) at org.apache.myfaces.trinidadinternal.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:176) at org.springframework.faces.webflow.JsfView.render(JsfView.java:94) at org.springframework.webflow.engine.ViewState.render(ViewState.java:245) at org.springframework.webflow.engine.ViewState.resume(ViewState.java:204) at org.springframework.webflow.engine.Flow.resume(Flow.java:545) at org.springframework.webflow.engine.impl.FlowExecutionImpl.resume(FlowExecutionImpl.java:262) at org.springframework.webflow.executor.FlowExecutorImpl.resumeExecution(FlowExecutorImpl.java:163) at org.springframework.webflow.mvc.servlet.FlowHandlerAdapter.handle(FlowHandlerAdapter.java:173) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:875) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:807) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:571) at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:511) at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.myfaces.trinidadinternal.webapp.TrinidadFilterImpl._invokeDoFilter(TrinidadFilterImpl.java:238) at org.apache.myfaces.trinidadinternal.webapp.TrinidadFilterImpl._doFilterImpl(TrinidadFilterImpl.java:195) at org.apache.myfaces.trinidadinternal.webapp.TrinidadFilterImpl.doFilter(TrinidadFilterImpl.java:138) at org.apache.myfaces.trinidad.webapp.TrinidadFilter.doFilter(TrinidadFilter.java:92) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:378) at org.springframework.security.intercept.web.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:109) at org.springframework.security.intercept.web.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:83) at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390) at org.springframework.security.ui.SessionFixationProtectionFilter.doFilterHttp(SessionFixationProtectionFilter.java:67) at org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53) at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390) at org.springframework.security.ui.ExceptionTranslationFilter.doFilterHttp(ExceptionTranslationFilter.java:101) at org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53) at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390) at org.springframework.security.wrapper.SecurityContextHolderAwareRequestFilter.doFilterHttp(SecurityContextHolderAwareRequestFilter.java:91) at org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53) at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390) at org.springframework.security.ui.AbstractProcessingFilter.doFilterHttp(AbstractProcessingFilter.java:277) at org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53) at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390) at org.springframework.security.ui.preauth.AbstractPreAuthenticatedProcessingFilter.doFilterHttp(AbstractPreAuthenticatedProcessingFilter.java:69) at org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53) at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390) at org.springframework.security.ui.logout.LogoutFilter.doFilterHttp(LogoutFilter.java:89) at org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53) at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390) at org.springframework.security.context.HttpSessionContextIntegrationFilter.doFilterHttp(HttpSessionContextIntegrationFilter.java:235) at org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53) at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390) at org.springframework.security.util.FilterChainProxy.doFilter(FilterChainProxy.java:175) at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:236) at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447) at java.lang.Thread.run(Thread.java:619) ============================================================ it's because that if Response object invoked getOutputStream() method, it can't invoke getWriter() method. this problem also often exist in JSP file. I searched it on google, there is a solution for JSP, but I haven't found any solution for JSF Trinidad. could anyone tell me how to solve this problem? Thank Your Very Much! |
|
freesky_zh
2009-03-04
Help!
![]() |
|
freesky_zh
2009-03-04
in JSP, add these two lines below
out.clear(); out = pageContext.pushBody(); In JSF, how can I do things like this? |
|
freesky_zh
2009-03-08
add more info.
I also use Spring Webflow in this case, I wonder if there is a confliction between Trinidad and Webflow. |
|
freesky_zh
2009-03-11
这个问题在导出CSV和PDF时都会出现.
在导出CSV的时候,可以用一个替代方案,就是用Writer代替OuputStream,这样就不会有异常了, 但是会有新的问题,that is, 每次导出CSV的时候都会包含前几次的导出内容. 导出PDF,我用的是iText,其步骤是 // step 1: creation of a document-object Document document = new Document(); // step 2: // we create a writer that listens to the document PdfWriter.getInstance(document, <OutputStream>); // step 3: we open the document document.open(); // step 4: we add a paragraph to the document document.add(new Paragraph("the file content")); // step 5: we close the document document.close(); 其中第2步,要求传入一个OutputStream Ojbect, PdfWriter.getInstance()方法签名中没有Writer对象参数。 不知道iText中除了PdfWriter,是否还有其他的输出对象可以传入Writer对象作为参数。 其他的导出pDF的包PDFLib PDFBox是否支持Writer输出,另外这些包是否免费? |
|
paomo30000
2009-03-15
使用
OutputStreamWriter outWriter = new OutputStreamWriter(response.getOutputStream(),response.getCharacterEncoding()); outWriter.write(returnStr); outWriter.flush(); outWriter.close(); FacesContext.getCurrentInstance().responseComplete(); 问题可得到解决 |
|
freesky_zh
2009-03-16
export CSV is ok.
the problem about exporting PDF file is still there. Every time I get the OutputStream by FacesContext context = FacesContext.getCurrentInstance(); HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse(); OutputStream out = response.getOutputStream(); there will be an exception as above. java.lang.IllegalStateException: getOutputStream() has already been called for this response the problem is that I use iText to export the PDF file, I have to use PdfWriter.getInstance(document, <OutputStream>); which needs an OutputStream object as parameter. So I can't use Writer to replace OutputStream. Could you tell me how to handle it? Thank you! |
|
terryzhou
2009-03-16
Another solution:
http://today.java.net/pub/a/today/2006/10/31/combine-facelets-and-flying-saucer-renderer.html |
|
freesky_zh
2009-03-18
thanks, Terry.
Flying Saucer XHTML Renderer can export to PDF file, but it also use OuputStream. HttpServletResponse response = (HttpServletResponse)resp; String renderType = request.getParameter("RenderOutputType"); ... StringReader contentReader = new StringReader(capContent.getContent()); InputSource source = new InputSource(contentReader); Document xhtmlContent = documentBuilder.parse(source); ... if(renderType.equals("pdf")){ ITextRenderer renderer = new ITextRenderer(); Renderer.setDocument(xhtmlContent,""); renderer.layout(); response.setContentType("application/pdf"); OutputStream browserStream = response.getOutputStream(); renderer.createPDF(browserStream); return; } |
|
freesky_zh
2009-03-26
is there anyone who can give me a solution for pdf export in JSF/Trinidad/Spring WebFlow?
Thanks. |