使用PrintWriter和OutputStream

我正在用struts创建一个项目,我使用Jasper IReports时遇到了问题。 我想将一些信息导出到pdf文件中,并且我一直在获取java.lang.IllegalStateException:getOutputStream()已被调用…由于在页面已经打开PrintWriter时在我的代码中打开ServletOutputStream而导致exception。

代码在模型中(所以它不在jsp中,它在java文件中),如下所示:

public void handle(HttpServletResponse res, Connection connection, String path)throws Exception{ ServletOutputStream out = null; try { JasperDesign jasperDesign = JRXmlLoader.load(path); JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign); byte[] bytes = JasperRunManager.runReportToPdf(jasperReport, null, connection); res.setContentType("application/pdf"); res.setContentLength(bytes.length); out = res.getOutputStream(); out.write(bytes, 0, bytes.length); } catch (Exception e) { e.printStackTrace(); } finally { out.flush(); out.close(); } 

我检查了连接,路径和HttpServletResponse,都运行正常。

我是Jasper Reports的新手以及编写PDF格式的东西,所以你可以 – 正确地 – 我对我在这里做的事情有一个很小的想法,显然我的代码是通过网络从某个地方复制/粘贴的。

我曾尝试使用PrintWriter而不是OutputStream,将字节转换为String并使用PrintWriter.append(String)方法(allthought不是String是CharSequence),但它不会将数据提取到PDF中。

我也尝试获取PrintWriter,关闭它以打开OutputStream(不起作用)或刷新它(两者都没有)。

任何帮助解决方案使用任何可以显示pdf数据的解决方案都会很棒。 非常感谢!

查看堆栈跟踪会很有用。

您可能首先尝试运行健全性检查:修改该代码以简单地将静态字符串(hello world)写入ServletOutputStream并将内容类型设置为text / html。 因为这应该工作正常:

 public void handle(HttpServletResponse res, Connection connection, String path)throws Exception{ ServletOutputStream out = null; try { byte[] bytes = "hello world".getBytes(); res.setContentType("text/html"); res.setContentLength(bytes.length); out = res.getOutputStream(); out.write(bytes, 0, bytes.length); } catch (Exception e) { e.printStackTrace(); } finally { out.flush(); out.close(); } 

HTH

一些想法:

  • 如果您使用二进制流(PDF是二进制),PrintWriter将无法工作
  • 如果客户端超时或断开连接,可能会发生非法状态。 该过程的数据包跟踪将告诉你很多(即使你不能很好地阅读它们)。 查看WireShark或您的平台可用的内容。 值得你花时间学习至少一点关于线路级别发生的事情。
  • 确保从报告生成中获取的数据实际上是pdf。 将其写入文件并尝试打开。
  • 某些情况需要您在写入流之前设置http长度标头,否则它们会在数据开始显示时放弃。 这里可能有必要。

如何调用代码? 从inicio2.jsp来看,它看起来就像是在JSP文件中使用scriptlet运行带有handle方法的Java类( inicio2.jspinicio2.jsp )。 之后,Java类已将报告写入OutputStream ,JSP文件将继续输出文件本身的残余(包括空格!),这将隐式调用getWriter()将其写入响应。 正是这样会导致IllegalStateException因为现在你已经在Java类中调用了getOutputStream()

将Java代码放在Java类中是件好事,但这并不意味着您仍然可以使用JSP来调用它。 JSP不应包含任何单行Java代码。 JSP本身就是视图技术输出的一部分。 要解决这个问题,只需要一个可以通过HTML

调用的Struts动作类(或HttpServlet )。

自己的回答:

我已经在路径中添加了一个实际连接到数据库的jrxml,并获得了一些真正的数据,并且它工作正常,PDF在Mozilla中打开,但Exception一直在发生。 我不知道如何抛出和exception(我已调试并且exception发生在同一个地方)并且能够看到PDF。

所以我只能继续寻找这里实际发生的事情。 我将回答我发现的任何事情(可能在星期一)。

感谢simonlord和Jim Rush的帮助! 🙂

编辑:顺便说一下,这是堆栈跟踪(它是西class牙语,如果需要我将翻译你不理解的任何东西):再次编辑:似乎我没有在2010年1月15日复制’1′..可能会对1月5日发生的一丝痕迹造成混乱。 纠正。

 15-ene-2010 13:47:03 org.apache.catalina.core.ApplicationDispatcher invoke GRAVE: El Servlet.service() para servlet jsp lanzó una excepción java.lang.IllegalStateException: getOutputStream() ya ha sido llamado para esta respuesta at org.apache.catalina.connector.Response.getWriter(Response.java:607) at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:196) at javax.servlet.ServletResponseWrapper.getWriter(ServletResponseWrapper.java:112) at org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:125) at org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:118) at org.apache.jasper.runtime.PageContextImpl.release(PageContextImpl.java:171) at org.apache.jasper.runtime.JspFactoryImpl.internalReleasePageContext(JspFactoryImpl.java:116) at org.apache.jasper.runtime.JspFactoryImpl.releasePageContext(JspFactoryImpl.java:76) at org.apache.jsp.pages.inicio2_jsp._jspService(inicio2_jsp.java:300) at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98) at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:331) at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:329) at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265) at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188) at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:679) at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:584) at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:497) at org.apache.struts.chain.commands.servlet.PerformForward.handleAsInclude(PerformForward.java:141) at org.apache.struts.chain.commands.servlet.PerformForward.perform(PerformForward.java:92) at org.apache.struts.chain.commands.AbstractPerformForward.execute(AbstractPerformForward.java:54) at org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:51) at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:191) at org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:305) at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:191) at org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:283) at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913) at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462) at javax.servlet.http.HttpServlet.service(HttpServlet.java:647) at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:873) at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665) at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528) at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81) at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689) at java.lang.Thread.run(Unknown Source) 15-ene-2010 13:47:03 org.apache.struts.chain.commands.AbstractExceptionHandler execute ADVERTENCIA: Unhandled exception org.apache.jasper.JasperException: getOutputStream() ya ha sido llamado para esta respuesta at org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:460) at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:367) at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:329) at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265) at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188) at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:679) at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:584) at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:497) at org.apache.struts.chain.commands.servlet.PerformForward.handleAsInclude(PerformForward.java:141) at org.apache.struts.chain.commands.servlet.PerformForward.perform(PerformForward.java:92) at org.apache.struts.chain.commands.AbstractPerformForward.execute(AbstractPerformForward.java:54) at org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:51) at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:191) at org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:305) at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:191) at org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:283) at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913) at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462) at javax.servlet.http.HttpServlet.service(HttpServlet.java:647) at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:873) at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665) at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528) at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81) at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689) at java.lang.Thread.run(Unknown Source) 15-ene-2010 13:47:03 org.apache.struts.chain.commands.ExceptionCatcher postprocess ADVERTENCIA: Exception from exceptionCommand 'servlet-exception' org.apache.jasper.JasperException: getOutputStream() ya ha sido llamado para esta respuesta at org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:460) at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:367) at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:329) at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265) at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188) at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:679) at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:584) at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:497) at org.apache.struts.chain.commands.servlet.PerformForward.handleAsInclude(PerformForward.java:141) at org.apache.struts.chain.commands.servlet.PerformForward.perform(PerformForward.java:92) at org.apache.struts.chain.commands.AbstractPerformForward.execute(AbstractPerformForward.java:54) at org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:51) at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:191) at org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:305) at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:191) at org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:283) at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913) at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462) at javax.servlet.http.HttpServlet.service(HttpServlet.java:647) at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:873) at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665) at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528) at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81) at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689) at java.lang.Thread.run(Unknown Source) 15-ene-2010 13:47:03 org.apache.catalina.core.StandardWrapperValve invoke GRAVE: Servlet.service() para servlet action lanzó excepción java.lang.IllegalStateException: getOutputStream() ya ha sido llamado para esta respuesta at org.apache.catalina.connector.Response.getWriter(Response.java:607) at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:196) at javax.servlet.ServletResponseWrapper.getWriter(ServletResponseWrapper.java:112) at org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:125) at org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:118) at org.apache.jasper.runtime.PageContextImpl.release(PageContextImpl.java:171) at org.apache.jasper.runtime.JspFactoryImpl.internalReleasePageContext(JspFactoryImpl.java:116) at org.apache.jasper.runtime.JspFactoryImpl.releasePageContext(JspFactoryImpl.java:76) at org.apache.jsp.pages.inicio2_jsp._jspService(inicio2_jsp.java:300) at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98) at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:331) at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:329) at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265) at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188) at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:679) at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:584) at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:497) at org.apache.struts.chain.commands.servlet.PerformForward.handleAsInclude(PerformForward.java:141) at org.apache.struts.chain.commands.servlet.PerformForward.perform(PerformForward.java:92) at org.apache.struts.chain.commands.AbstractPerformForward.execute(AbstractPerformForward.java:54) at org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:51) at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:191) at org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:305) at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:191) at org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:283) at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913) at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462) at javax.servlet.http.HttpServlet.service(HttpServlet.java:647) at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:873) at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665) at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528) at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81) at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689) at java.lang.Thread.run(Unknown Source)