<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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

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

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

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

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

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

    在使用完輸出流以后調用以下兩行代碼即可:
    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 流浪汗 閱讀(6613) 評論(7)  編輯  收藏 所屬分類: Tomcat

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

    記得Action方法一開始加
    response.addHeader("Content-Disposition","attachment;filename=your_file_name.xls");
      回復  更多評論
      
    # re: tomcat5下jsp出現getOutputStream() has already been called for this response異常的原因和解決方法 2008-03-07 23:22 | bb
    ddddddddddddddddddddddddddddddddddddddddddd  回復  更多評論
      
    # re: tomcat5下jsp出現getOutputStream() has already been called for this response異常的原因和解決方法 2008-06-17 10:51 | 桐花一瞬 ziding1999@hotmail.com
    我也遇到了此問題,但加入那兩句代碼后,out是哪個包中的?  回復  更多評論
      
    # re: tomcat5下jsp出現getOutputStream() has already been called for this response異常的原因和解決方法 2008-06-22 23:28 | 流浪汗
    @桐花一瞬 ziding1999@hotmail.com
    out是jsp自有的  回復  更多評論
      
    # re: tomcat5下jsp出現getOutputStream() has already been called for this response異常的原因和解決方法 2009-10-31 09:14 | zxb
    我是在action里面調用的呀  回復  更多評論
      
    主站蜘蛛池模板: 成人无码精品1区2区3区免费看| 亚洲精品美女久久7777777| 亚洲精品黄色视频在线观看免费资源 | 亚洲无砖砖区免费| 亚洲精品线在线观看| 久久香蕉国产线看免费| 久久精品夜色国产亚洲av| 久久久久久国产精品免费免费男同| 国产亚洲色视频在线| 热99RE久久精品这里都是精品免费| 亚洲色婷婷一区二区三区| 东方aⅴ免费观看久久av| 亚洲图片一区二区| 久久久精品免费视频| 亚洲色图.com| 免费无码一区二区三区蜜桃大| 国产成人亚洲毛片| 久久激情亚洲精品无码?V| 国产无遮挡无码视频免费软件| 男人j进入女人j内部免费网站| 亚洲AV乱码一区二区三区林ゆな| 97国产在线公开免费观看| 亚洲综合久久一本伊伊区| 免费一级e一片在线播放| 久草免费福利在线| 久久精品国产亚洲av麻豆色欲| 999久久久免费精品国产| 日韩亚洲人成网站| 亚洲乱码中文字幕综合| 亚洲日韩国产一区二区三区在线 | 久久国产精品免费一区二区三区| 亚洲V无码一区二区三区四区观看| 3d成人免费动漫在线观看| 亚洲AV日韩AV一区二区三曲| 337p日本欧洲亚洲大胆裸体艺术| 美丽姑娘免费观看在线观看中文版| 国产日韩成人亚洲丁香婷婷| 久久久久免费看成人影片| 亚洲国产综合AV在线观看| 亚洲精品高清国产一线久久| 一个人免费观看在线视频www|