<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里面調用的呀  回復  更多評論
      
    主站蜘蛛池模板: 日本亚洲成高清一区二区三区| 在线免费视频一区二区| 亚洲男女内射在线播放| 亚洲成a人无码亚洲成www牛牛| 国产片AV片永久免费观看| 亚洲白色白色永久观看| 久久99国产乱子伦精品免费| 久久91亚洲精品中文字幕| 香蕉视频在线免费看| 国产成A人亚洲精V品无码| 美女在线视频观看影院免费天天看| 亚洲无av在线中文字幕| 久久永久免费人妻精品| 亚洲国产成人精品不卡青青草原| 久久精品一本到99热免费| 亚洲精品电影在线| 一二三四在线观看免费高清中文在线观看 | 亚洲最大av资源站无码av网址| 人禽杂交18禁网站免费| 久久精品亚洲日本波多野结衣| 免费不卡中文字幕在线| 和老外3p爽粗大免费视频 | 亚洲日韩在线视频| 成人黄软件网18免费下载成人黄18免费视频 | 乱爱性全过程免费视频| 亚洲另类激情综合偷自拍图| 无码AV片在线观看免费| 亚洲精品国产日韩| 亚洲精品97久久中文字幕无码| 野花香高清在线观看视频播放免费 | 免费精品一区二区三区第35| 亚洲国产成人九九综合| 四虎影视永久免费观看| 中文字幕在线免费看| 亚洲午夜久久久精品电影院| 国产免费久久精品| 人人玩人人添人人澡免费| 中文字幕在线日亚洲9| 伊人久久亚洲综合| av无码免费一区二区三区| 视频免费1区二区三区|