java.lang.IllegalStateException: Вече се използва изходен поток [затворен]

windchill GUI в браузъра от страна на клиента, когато потребител щракне върху бутон, конкретен pdf файл трябва да бъде изтеглен в неговата система. Постигнах това с помощта на следния код.

   <body>
    <%
    String pdfname=   session.getAttribute("pdfname").toString();
    String Pdfpath=   session.getAttribute("pdfpath").toString();
    File f =new File(Pdfpath);
     Boolean flag=false;
      if(f.exists())
      {
     BufferedInputStream filein = null;
     BufferedOutputStream out2=null;
    try {
    File file = new File(Pdfpath);//specify the file path
    byte b[] = new byte[1048576];
    int len = 0;
    filein = new BufferedInputStream(new FileInputStream(file));
    out2=new BufferedOutputStream(response.getOutputStream());
    response.setHeader("Content-Length", ""+file.length());
    response.setContentType("application/pdf");
    response.setHeader("Content-Disposition","attachment;filename="+pdfname);
    response.setHeader("Content-Transfer-Encoding", "binary");
    while ((len = filein.read(b)) > 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);
    }
     %>
    </body>

Този код работи добре и файлът се изтегля, но след това хвърля изключение. Следното е регистрационният файл на сървъра на моя метод

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: ......

......

В Google има много публикации относно това изключение, но не мога да изчистя грешката си. Също така се опитах да добавя това в сервлет вместо jsp. Това също показва същото изключение. Правилен ли е този начин за изтегляне на файл или аз съм в грешка? имам нужда от помощ

Благодаря


person Vignesh Vino    schedule 28.03.2013    source източник


Отговори (3)


Не можете да използвате едновременно getServletOutputStream() и getWriter() в един и същи отговор.

Стигаме до вашия проблем. Избягвайте да пишете скриптове в JSP. Каквото и да правите в JSP, внедрете го в Servlet.

Извиквате response.getOutputStream(); в JSP, което е незаконно. Трябва да използвате ServletResponse.getOutputStream() или ServletResponse.getWriter(). Тъй като JSP използва ServletResponse.getWriter() по подразбиране. Трябва да пишете на ServletResponse.getWriter() вместо ServletResponse.getOutputStream()

Ето какво казва Java Doc:

getOutputStream...

ServletOutputStream getOutputStream() хвърля IOException

Връща ServletOutputStream, подходящ за запис на двоични данни в отговора. Контейнерът на сървлета не кодира двоичните данни.

Извикването на flush() на ServletOutputStream ангажира отговора. Или този метод, или getWriter() може да бъде извикан за запис на тялото, не и двата.

Връща: ServletOutputStream за запис на двоични данни Изхвърля: IllegalStateException - ако методът getWriter е бил извикан при този отговор

person Ramesh PVK    schedule 28.03.2013
comment
При добавяне на ServletResponse.getWriter() към изходния поток той показва грешката Cannot make a static reference to the non-static method getWriter() from the type ServletResponse Помогнете за разрешаването на това - person Vignesh Vino; 05.04.2013

Изглежда, че изключението е хвърлено от този ред.

out.println(e);

В случай, че вашият код за изпращане на PDF като приложение се провали по време на писане, тогава ще бъде изведено изключение и докато се опитвате да отпечатате изключението с горния ред, изходният поток вече се използва.

Не смесвайте потребителски интерфейс и бизнес логика в JSP. Използвайте сервлет, за да свършите тази работа.

person shazin    schedule 28.03.2013

Имате </body> след вашия скрипт. Той ще отпечата нещо в изходния поток на отговора, но вие вече сте затворили този преди.

Какъв смисъл има да включвате <body> тагове в отговора си, когато това, което всъщност искате да направите, е да изпратите PDF файл обратно към клиента?

person mthmulders    schedule 28.03.2013
comment
Затворих ‹/body› преди отговор сега. Показва същото изключение - person Vignesh Vino; 28.03.2013
comment
Защо изобщо включвате <body> и </body>? Стриймвате PDF файл, нали? - person mthmulders; 28.03.2013
comment
Да.. Тъй като използвам jsp, си помислих, че скриптлетите трябва да се добавят в маркера body - person Vignesh Vino; 28.03.2013
comment
Ако единственото нещо, което вашият JSP прави, е стрийминг на PDF, не е нужно да обграждате скриптлета с <body> и </body>. - person mthmulders; 28.03.2013