java.lang.IllegalStateException:已经使用输出流

当用户点击按钮时,客户端浏览器上的windchill GUI应该在他的系统上下载特定的pdf文件。我已经通过使用以下代码实现了这一点。

  0) { out2.write(b, 0, len); out.println("Your Pdf Document Is Generated Please close it"); } filein.close(); out2.flush(); out2.close(); } catch(Exception e) { out.println(e); } }else{ String error ="File Not Found Or File Has Bean Deleted Already"; request.setAttribute("error", error); RequestDispatcher s = request.getRequestDispatcher("NoFile.jsp"); s.forward(request, response); } %>  

此代码工作正常,文件正在下载,但之后它会引发exception。以下是我的方法服务器日志

 ERROR : org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/Windchill].[jsp] - Servlet.service() for servlet jsp threw exception Thu 3/28/13 12:29:07: TP-Processor7: java.lang.IllegalStateException: Already using output stream Thu 3/28/13 12:29:07: TP-Processor7: at wt.servlet.CompressionFilter$GzippingResponse.getWriter(CompressionFilter.java:860) Thu 3/28/13 12:29:07: TP-Processor7: at org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:125) Thu 3/28/13 12:29:07: TP-Processor7: at org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:118) Thu 3/28/13 12:29:07: TP-Processor7: at org.apache.jasper.runtime.JspWriterImpl.flush(JspWriterImpl.java:173) Thu 3/28/13 12:29:07: TP-Processor7: at org.apache.jasper.runtime.JspWriterImpl.close(JspWriterImpl.java:187) Thu 3/28/13 12:29:07: TP-Processor7: at org.apache.jsp.netmarkets.jsp.gt.get_jsp._jspService(get_jsp.java:105) Thu 3/28/13 12:29:07: TP-Processor7: at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) Thu 3/28/13 12:29:07: TP-Processor7: at javax.servlet.http.HttpServlet.service(HttpServlet.java:803) Thu 3/28/13 12:29:07: TP-Processor7: at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:388) Thu 3/28/13 12:29:07: TP-Processor7: at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313) Thu 3/28/13 12:29:07: TP-Processor7: at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260) Thu 3/28/13 12:29:07: TP-Processor7: at javax.servlet.http.HttpServlet.service(HttpServlet.java:803) Thu 3/28/13 12:29:07: TP-Processor7: at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) Thu 3/28/13 12:29:07: TP-Processor7: at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) Thu 3/28/13 12:29:07: TP-Processor7: at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646) Thu 3/28/13 12:29:07: TP-Processor7: at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:436) Thu 3/28/13 12:29:07: TP-Processor7: at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:374) Thu 3/28/13 12:29:07: TP-Processor7: at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:302) Thu 3/28/13 12:29:07: TP-Processor7: ...... 

……

谷歌有很多关于这个例外的post,但我无法清除我的错误。 我也尝试在servlet中添加它而不是jsp。 这也显示了相同的exception。这样下载文件的方式是正确的还是我错了? 我需要帮助

谢谢

您不能在同一响应中同时使用getServletOutputStream()getWriter()

来你的问题。 避免在JSP中编写scriptlet。 无论你在JSP中做什么,在Servlet中实现它。

你正在调用response.getOutputStream(); 在JSP中是非法的。 您应该使用ServletResponse.getOutputStream()ServletResponse.getWriter() 。 由于JSP默认使用ServletResponse.getWriter()。 你应该写ServletResponse.getWriter()而不是ServletResponse.getOutputStream()

这就是Java Doc所说的:

的getOutputStream …

ServletOutputStream getOutputStream()抛出IOException

返回适合在响应中写入二进制数据的ServletOutputStream。 servlet容器不对二进制数据进行编码。

在ServletOutputStream上调用flush()会提交响应。 可以调用此方法或getWriter()来编写正文,而不是两者。

返回:用于写入二进制数据的ServletOutputStream 抛出:IllegalStateException – 如果已在此响应上调用getWriter方法

好像从这一行抛出exception。

 out.println(e); 

如果您在编写应用程序时将PDF作为应用程序发送失败,则会抛出exception,并且在尝试使用上面的行打印exception时,outputputstream已被使用。

不要在JSP中混用UI和业务逻辑。 使用Servlet完成这项工作。

您的scriptlet之后有 。 它会在响应输出流中打印一些内容,但您之前已经关闭了该内容。

当您真正想要做的是将PDF流回客户端时,在您的响应中包含标记会有什么意义?