隨筆-153  評論-235  文章-19  trackbacks-0

          【標  題】:tomcat5下jsp出現(xiàn)getOutputStream() has already been called for this response異常的原因和解決方法
          【關(guān)鍵字】:tomcat5,jsp,getOutputStream,has,already,been,called,for,this,response
          【來  源】:http://blog.csdn.net/alexwan/archive/2007/02/13/1508871.aspx

          tomcat5下jsp出現(xiàn)getOutputStream() has already been called for this response異常的原因和解決方法

          在tomcat5下jsp中出現(xiàn)此錯誤一般都是在jsp中使用了輸出流(如輸出圖片驗證碼,文件下載等),
          沒有妥善處理好的原因。

          具體的原因就是
          在tomcat中jsp編譯成servlet之后在函數(shù)_jspService(HttpServletRequest request, HttpServletResponse response)的最后
          有一段這樣的代碼
          finally {
                if (_jspxFactory != null) _jspxFactory.releasePageContext(_jspx_page_context);
              }
          這里是在釋放在jsp中使用的對象,會調(diào)用response.getWriter(),因為這個方法是和
          response.getOutputStream()相沖突的!所以會出現(xiàn)以上這個異常。

          然后當然是要提出解決的辦法,其實挺簡單的(并不是和某些朋友說的那樣--
          將jsp內(nèi)的所有空格和回車符號所有都刪除掉),

          在使用完輸出流以后調(diào)用以下兩行代碼即可:
          out.clear();
          out = pageContext.pushBody();

          最后這里是一個輸出彩色驗證碼例子(這樣的例子幾乎隨處可見)
          imag.jsp

           

          <% @ page   import = " java.awt.*,java.awt.image.*,java.util.*,javax.imageio.* "   %>
          <% @ page  import = " java.io.OutputStream "   %>
          <%!
          Color getRandColor(
          int  fc, int  bc){
          Random random 
          =   new  Random();
          if (fc > 255 ) fc = 255 ;
          if (bc > 255 ) bc = 255 ;
          int  r = fc + random.nextInt(bc - fc);
          int  g = fc + random.nextInt(bc - fc);
          int  b = fc + random.nextInt(bc - fc);
          return   new  Color(r,g,b);
          }
          %>
          <%
          try {
          response.setHeader(
          " Pragma " , " No-cache " );
          response.setHeader(
          " Cache-Control " , " no-cache " );
          response.setDateHeader(
          " Expires " 0 );
          int  width = 60 , height = 20 ;
          BufferedImage image 
          =   new  BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
          OutputStream os
          = response.getOutputStream();
          Graphics g 
          =  image.getGraphics();
          Random random 
          =   new  Random();
          g.setColor(getRandColor(
          200 , 250 ));
          g.fillRect(
          0 0 , width, height);

          g.setFont(
          new  Font( " Times New Roman " ,Font.PLAIN, 18 ));
          g.setColor(getRandColor(
          160 , 200 ));
          for  ( int  i = 0 ;i < 155 ;i ++ )
          {
          int  x  =  random.nextInt(width);
          int  y  =  random.nextInt(height);
          int  xl  =  random.nextInt( 12 );
          int  yl  =  random.nextInt( 12 );
          g.drawLine(x,y,x
          + xl,y + yl);
          }
          String sRand
          = "" ;
          for  ( int  i = 0 ;i < 4 ;i ++ ){
          String rand
          = String.valueOf(random.nextInt( 10 ));
          sRand
          += rand;
          g.setColor(
          new  Color( 20 + random.nextInt( 110 ), 20 + random.nextInt( 110 ), 20 + random.nextInt( 110 )));
          g.drawString(rand,
          13 * i + 6 , 16 );
          }
          session.setAttribute(
          " rand " ,sRand);
          g.dispose();

          ImageIO.write(image, 
          " JPEG " ,os);
          os.flush();
          os.close();
          os
          = null ;
          response.flushBuffer();
          out.clear();
          out 
          =  pageContext.pushBody();
          }
          catch (IllegalStateException e)
          {
          System.out.println(e.getMessage());
          e.printStackTrace();
          }
          %>

           

          posted on 2007-03-19 12:57 流浪汗 閱讀(6615) 評論(7)  編輯  收藏 所屬分類: Tomcat

          評論:
          # re: tomcat5下jsp出現(xiàn)getOutputStream() has already been called for this response異常的原因和解決方法[未登錄] 2007-05-26 13:47 | xiaoquan
          多謝樓上的指點!我遇到這個問題已經(jīng)解決!  回復(fù)  更多評論
            
          # re: tomcat5下jsp出現(xiàn)getOutputStream() has already been called for this response異常的原因和解決方法 2007-12-25 18:14 | yangweiwei.china@hotmail.com
          我遇到這個問題了。但是你的解決方案中
          out.clear();
          out = pageContext.pushBody();
          這兩行代碼是寫在JSP中的
          我用Action類實現(xiàn)的生成Excel文件,在JAVA類中怎么解決這個問題?
          謝謝!
          我的MSN:yangweiwei.china@hotmail.com
          因為很急,在線等待  回復(fù)  更多評論
            
          # re: tomcat5下jsp出現(xiàn)getOutputStream() has already been called for this response異常的原因和解決方法 2007-12-26 10:06 | 流浪汗
          在Action更加容易解決。
          直接把response.getOutputStream()作參數(shù)傳給寫Excel的方法或類。在Action里return null;就行了。

          記得Action方法一開始加
          response.addHeader("Content-Disposition","attachment;filename=your_file_name.xls");
            回復(fù)  更多評論
            
          # re: tomcat5下jsp出現(xiàn)getOutputStream() has already been called for this response異常的原因和解決方法 2008-03-07 23:22 | bb
          ddddddddddddddddddddddddddddddddddddddddddd  回復(fù)  更多評論
            
          # re: tomcat5下jsp出現(xiàn)getOutputStream() has already been called for this response異常的原因和解決方法 2008-06-17 10:51 | 桐花一瞬 ziding1999@hotmail.com
          我也遇到了此問題,但加入那兩句代碼后,out是哪個包中的?  回復(fù)  更多評論
            
          # re: tomcat5下jsp出現(xiàn)getOutputStream() has already been called for this response異常的原因和解決方法 2008-06-22 23:28 | 流浪汗
          @桐花一瞬 ziding1999@hotmail.com
          out是jsp自有的  回復(fù)  更多評論
            
          # re: tomcat5下jsp出現(xiàn)getOutputStream() has already been called for this response異常的原因和解決方法 2009-10-31 09:14 | zxb
          我是在action里面調(diào)用的呀  回復(fù)  更多評論
            
          主站蜘蛛池模板: 龙井市| 枞阳县| 磴口县| 闽侯县| 布拖县| 茶陵县| 平遥县| 常熟市| 灵川县| 都安| 侯马市| 文山县| 宁河县| 常熟市| 滨州市| 义乌市| 沛县| 怀仁县| 邳州市| 七台河市| 突泉县| 丰宁| 龙里县| 汝阳县| 右玉县| 八宿县| 宜宾市| 新巴尔虎左旗| 孝义市| 大方县| 文山县| 九台市| 襄樊市| 武安市| 封开县| 藁城市| 乌兰察布市| 磐安县| 诸城市| 邹城市| 班戈县|