<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里面調用的呀  回復  更多評論
      
    主站蜘蛛池模板: 9久热精品免费观看视频| 24小时免费看片| 亚洲AV无码日韩AV无码导航| 日韩人妻一区二区三区免费| 中国亚洲呦女专区| 精品国产人成亚洲区| 久久久久久精品免费看SSS| 一级做a爰片久久毛片免费陪| 亚洲最大成人网色| 日本a级片免费看| 日本人成在线视频免费播放| 国产精品亚洲专区无码WEB| 久久久亚洲裙底偷窥综合| 亚洲视频在线一区二区| 成人免费在线视频| 久久国产乱子精品免费女| 免费夜色污私人影院网站电影| 亚洲一级毛片中文字幕| 亚洲精品无码久久久久去q| 日韩成人免费在线| 波多野结衣视频在线免费观看| 青青青国产在线观看免费网站| 中文字幕乱码免费看电影| 亚洲AV无码AV日韩AV网站| 亚洲国产av美女网站| 亚洲国产精品久久久久婷婷老年 | 亚洲午夜电影一区二区三区| 亚洲国产人成在线观看| 亚洲日韩看片无码电影| 亚洲日本在线免费观看| 久久精品亚洲视频| 亚洲男人天堂影院| 亚洲视频免费在线播放| 亚洲成a人片在线观看精品| 亚洲精品福利网站| 亚洲欧美日韩综合久久久久| 九九九精品视频免费| jizzjizz亚洲日本少妇| fc2成年免费共享视频网站| 日本永久免费a∨在线视频| 成年免费a级毛片免费看无码|