<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里面調用的呀  回復  更多評論
      
    主站蜘蛛池模板: 国产精品亚洲一区二区在线观看| 亚洲av福利无码无一区二区| 亚洲乱亚洲乱妇无码| 国产高清不卡免费在线| 久久亚洲熟女cc98cm| 国产乱子精品免费视观看片| 亚洲天堂中文字幕在线观看| 久久久久久免费视频| 亚洲色偷偷偷综合网| 免费国产在线观看老王影院| 全部一级一级毛片免费看| 精品国产亚洲男女在线线电影 | 国产成人免费a在线视频色戒| 亚洲熟妇成人精品一区| 国产精品免费一级在线观看| 青草青草视频2免费观看| 亚洲天堂中文字幕在线| 久久免费区一区二区三波多野| 亚洲综合日韩中文字幕v在线| 精品成在人线AV无码免费看| 久久亚洲国产成人影院| 无码专区一va亚洲v专区在线 | 日韩免费电影网址| 亚洲婷婷综合色高清在线| 女性自慰aⅴ片高清免费| 一区二区三区AV高清免费波多| 久久亚洲国产中v天仙www| 无码国产精品一区二区免费| 亚洲熟女综合色一区二区三区| 免费大黄网站在线观看| 日韩精品在线免费观看| 亚洲精品久久无码| 亚洲精品国产精品乱码不99 | 88xx成人永久免费观看| 亚洲欧美第一成人网站7777| 亚洲天堂在线视频| 日本一区二区三区免费高清| 一区二区三区免费高清视频| 亚洲精品国产肉丝袜久久| 免费大片黄手机在线观看| 欧洲精品99毛片免费高清观看 |