vickzhu

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            151 隨筆 :: 0 文章 :: 34 評論 :: 0 Trackbacks
              getOutputStream() has already been called for this response 這個錯誤遇到過不少次,網(wǎng)上看到大多不能解決問題。
              下面兩點是我自己總結(jié)出來的:
              1、在我們應(yīng)用驗證碼時,都會用到字節(jié)流response.getOutputStream()來將驗證碼輸出,但是jsp頁面自己最后會調(diào)用字符流JspWriter的out()方法將頁面的內(nèi)容輸出。通過查看servlet的API我們可以看到知道,在servlet中不能夠同時利用這兩個流輸出,解決辦法將驗證碼寫在servlet中,具體見下面。
              2、相信請求轉(zhuǎn)發(fā)( request.getRequestDispacher().forward() )和請求跳轉(zhuǎn)( response.sendRedirect() )的區(qū)別大家都知道。其中request.getRequestDispacher().forward() 方法的調(diào)用者與被調(diào)用者之間共享相同的request對象和response對象,它們屬于同一個訪問請求和響應(yīng)過程。JSP頁面轉(zhuǎn)譯為的_servlet會最后調(diào)用releasePageContext()方法( All PageContext objects obtained via this method shall be released by invoking releasePageContext().)釋放我們頁面所有的實體對象,當我們的調(diào)用者有頁面輸出時,就會拋出這個異常。具體原因也沒有弄清楚,各位大俠如果誰知道可以告知一下。其實驗證碼也是同一個原理,如果我們將驗證碼的代碼寫在jsp頁面中,因為jsp頁面會調(diào)用JspWriter的out()方法將內(nèi)容輸出,同時我們的圖片又調(diào)用了response.getOutputStream()方法因此會拋出這個異常;如果我們將驗證碼寫在servlet中,就不會同時使用兩種輸出也就不會出錯。有時即使調(diào)用者頁面沒有輸出,也會拋出這個異常,仔細看jsp轉(zhuǎn)譯以后的源碼發(fā)現(xiàn)輸出了換行,因此,我們最好把調(diào)用者頁面的%>和<%之間換行去掉,把%>和<%直接寫在一起。
              另外,如果我們實在要在jsp中用到response.getOutputStream(),比如驗證碼、jspSmartUpload,我們需要在最后加入如下代碼:
                  response.reset();
                  out.clear();
                  out=pageContext.pushBody();

              有不對之處還望指教!
              
          posted on 2008-11-03 14:38 筱 筱 閱讀(37270) 評論(19)  編輯  收藏

          評論

          # re: getOutputStream() has already been called for this response 錯誤解決 2009-04-20 11:37 gby
          好!??!  回復(fù)  更多評論
            

          # re: getOutputStream() has already been called for this response 錯誤解決[未登錄] 2010-01-27 15:36 steven
          out.clear();
          out=pageContext.pushBody();

          怎么設(shè)置 out 變量?  回復(fù)  更多評論
            

          # re: getOutputStream() has already been called for this response 錯誤解決[未登錄] 2011-08-13 10:59 啊啊
          我怎么覺得沒什么用?。窟€是一樣的報這個錯誤的了?  回復(fù)  更多評論
            

          # re: getOutputStream() has already been called for this response 錯誤解決[未登錄] 2011-08-25 10:23 K
          不錯了,解決,3Q  回復(fù)  更多評論
            

          # re: getOutputStream() has already been called for this response 錯誤解決 2012-03-09 11:07 xuexizhe
          good
            回復(fù)  更多評論
            

          # re: getOutputStream() has already been called for this response 錯誤解決 2012-04-11 20:09 Aluo
          問題解決,Thank you very much?。?!  回復(fù)  更多評論
            

          # re: getOutputStream() has already been called for this response 錯誤解決 2012-04-20 15:30 sdf
          太好了 呵呵 幫助很大  回復(fù)  更多評論
            

          # re: getOutputStream() has already been called for this response 錯誤解決[未登錄] 2012-05-03 15:35 zxd
          太棒了,謝謝你偶像,問題解決了!!!!!  回復(fù)  更多評論
            

          # re: getOutputStream() has already been called for this response 錯誤解決[未登錄] 2012-05-08 15:16 hhh
          按照你說的, 在后面加了那兩句,換了最下面的那個錯誤了....
          -------------------------------------------------
          <%@page contentType="text/html" pageEncoding="UTF-8"%>
          <%@page import="java.awt.image.BufferedImage,javax.imageio.ImageIO" %>
          <%@page import="com.shopzdw.shop.image.Pair,com.shopzdw.shop.image.ImageOut" %>
          <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
          "http://www.w3.org/TR/html4/loose.dtd">
          <%
          response.setContentType("image/jpeg");
          response.setHeader("Pragma", "No-cache");
          response.setHeader("Cache-Control", "no-cache");
          response.setDateHeader("Expires", 0);
          Pair<String, BufferedImage> p = ImageOut.getImage();
          ImageIO.write(p.getValue(), "JPEG", response.getOutputStream());
          session.setAttribute("valid", p.getKey());



          response.reset();
          out.clear();
          out=pageContext.pushBody();
          %>

          ----------------------------------------------------------------
          2012-5-8 15:12:50 org.apache.catalina.core.StandardWrapperValve invoke
          嚴重: Servlet.service() for servlet jsp threw exception
          java.lang.IllegalStateException
          at org.apache.catalina.connector.ResponseFacade.reset(ResponseFacade.java:310)
          at org.apache.jsp.ValidateImage_jsp._jspService(ValidateImage_jsp.java:71)
          at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
          at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
          at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:393)
          at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
          at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
          at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
          at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
          at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
          at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:88)
          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:230)
          at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
          at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
          at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
          at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
          at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:261)
          at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
          at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:581)
          at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
          at java.lang.Thread.run(Thread.java:619)
            回復(fù)  更多評論
            

          # re: getOutputStream() has already been called for this response 錯誤解決 2012-05-09 15:50 wwt
          把response.reset();去掉就可以了。
          @hhh
            回復(fù)  更多評論
            

          # re: getOutputStream() has already been called for this response 錯誤解決[未登錄] 2012-07-02 11:39 a
          那如果前臺是靜態(tài)頁面呢?請問怎么辦?  回復(fù)  更多評論
            

          # re: getOutputStream() has already been called for this response 錯誤解決[未登錄] 2012-07-18 10:21 lee
          非常感謝,我也是一樣的問題。  回復(fù)  更多評論
            

          # re: getOutputStream() has already been called for this response 錯誤解決 2012-07-22 11:46 linman
          很好,謝謝!  回復(fù)  更多評論
            

          # re: getOutputStream() has already been called for this response 錯誤解決[未登錄] 2012-07-27 18:31 xx
          非常感謝  回復(fù)  更多評論
            

          # re: getOutputStream() has already been called for this response 錯誤解決 2012-08-09 17:59 SSDU灬丨HJ
          效果明顯 謝謝!  回復(fù)  更多評論
            

          # re: getOutputStream() has already been called for this response 錯誤解決 2012-09-25 12:13 lmf
          @hhh
          去年response.reset();即可  回復(fù)  更多評論
            

          # re: getOutputStream() has already been called for this response 錯誤解決 2014-10-22 16:16 jsp
          我的jsp頁面并沒有用到response.getOutputStream();呢?但是還是報了getOutputStream() has already been called for this response錯  回復(fù)  更多評論
            

          # re: getOutputStream() has already been called for this response 錯誤解決 2015-04-22 14:44 lpy
          3q問題解決了  回復(fù)  更多評論
            

          # re: getOutputStream() has already been called for this response 錯誤解決[未登錄] 2016-04-08 17:44 s
          asda  回復(fù)  更多評論
            


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 武功县| 常山县| 南召县| 武平县| 格尔木市| 启东市| 沛县| 建德市| 廊坊市| 临泽县| 惠州市| 太仆寺旗| 辽宁省| 阿瓦提县| 衡东县| 萍乡市| 绥德县| 商丘市| 商洛市| 资源县| 滦平县| 松阳县| 商南县| 娄烦县| 许昌市| 浦北县| 军事| 沁水县| 通城县| 榆林市| 锡林浩特市| 清水县| 军事| 肃北| 延安市| 米易县| 蓬莱市| 安新县| 湟源县| 衡阳县| 河东区|