Java 使用PrintWriter和OutputStream

Java 使用PrintWriter和OutputStream,java,servlets,outputstream,printwriter,Java,Servlets,Outputstream,Printwriter,我正在用struts创建一个项目,但在使用Jasper IReports时遇到了一个问题。我想将一些信息导出到pdf文件中,我一直得到java.lang.IllegalStateException:getOutputStream()已被调用。。。当页面已经打开PrintWriter时,由于在我的代码中打开ServletOutputStream而导致的异常 代码在模型中(因此它不在jsp中,而是在java文件中),如下所示: public void handle(HttpServletRe

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

代码在模型中(因此它不在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报告以及将内容编码为PDF非常熟悉,因此您可以正确地看到,我对我在这里所做的事情有一点了解,很明显,我的代码是通过网络从某处复制/粘贴的

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

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

任何关于使用能够以pdf格式显示数据的out的解决方案的帮助都是非常好的。
非常感谢

查看堆栈跟踪将非常有用

不过,您可以先尝试运行健全性检查:修改该代码,只需将静态字符串(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长度头,否则当数据开始显示时就会放弃。这里可能有必要
    • 自己的答案:

      我在路径中加入了一个jrxml,它实际上连接到数据库,并获取一些真实数据,然后它突然工作了,在mozilla中打开了PDF,但异常仍在发生。我不知道如何抛出和异常(我已经调试过,异常发生在同一个地方),并且能够看到PDF

      所以我只能继续寻找这里到底发生了什么。我会回答任何我发现的问题(可能在周一)

      谢谢simonlord和Jim Rush的帮助!:)

      编辑:顺便说一下,这是stacktrace(它是西班牙语的,如果需要,我会翻译任何你不懂的内容): 再次编辑:似乎我没有在2010年1月15日复制“1”。。。可能会对1月5日insetad的痕迹造成混淆。更正

      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)
      

      代码究竟是如何调用的?从stacktrace判断,您似乎正在使用JSP文件中的scriptlets(确切地说是
      inicio2.JSP
      )使用
      handle
      方法运行Java类。Java类将报告写入
      OutputStream
      之后,JSP文件将继续输出文件本身的剩余部分(包括空格!),这将隐式调用
      getWriter()
      ,将其写入响应。当Java类中以前已经调用了
      getOutputStream()
      时,这将导致一个
      IllegalStateException


      将Java代码放在Java类中很好,但这并不意味着您仍然可以使用JSP来调用它。JSP不应该包含任何一行Java代码。JSP本身是作为视图技术输出的一部分。要解决这一切,只需有一个Struts操作类(或一个
      HttpServlet
      ),可以由打开PrintWriter的HTML

      调用。JSP文件在启动时会尝试打开PrintWriter。因此,当我通过ActionMapping.findforward将控件发送到jsp文件时,jsp将打开PrintWriter并开始显示jsp。我解决这个问题的办法是不带着我找到的东西去任何地方。因此没有要加载的JSP文件(没有要加载的内容),PDF代码(通过OutputStream)进入页面时没有加载JSP文件,因此没有加载PrintWriter。事实上,这段代码工作得非常好。我不明白,因为我认为不能同时打开OutputStream和PrintWriter。是否通过将内容类型设置为“text/html”,它会以某种方式覆盖PrintWriter?不,我认为只有一个可以打开:
      http://java.sun.com/j2ee/1.4/docs/api/javax/servlet/ServletResponse.html#getOutputStream()
      在写入outputstream后,是否尝试调用getWriter()?如果你是,那就是为什么你会得到illegalstateexception。我想我现在明白了,当outputStream写入pdf时,程序仍然会完成到actionmapping.findforward(到我的jsp)的操作。jsp使用PrintWriter进行编写。我认为这就是问题所在,为什么现在我可以看到我的pdf文件并引发异常。我可以尝试使用actionmapping不去任何地方,因此使用PrintWriter也不例外。这是我的lat stacktrace:15-ene-2010 14:09:48 org.apache.struts.action.actionmapping find forward ADVERTENCIA:无法找到“”转发。也不例外,;但我想知道这个程序如何符合良好的实践。。。(正如我所料,根本没有)谢谢!我做了一个简单的Java项目(不是webapp)并尝试创建一个PDF文件,我的jrxml似乎可以工作。我将搜索导线级别中发生的情况。我的报告很短(大约200个角色)