请您先登录,才能继续操作

[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.
Global site tag (gtag.js) - Google Analytics