tomcat5下jsp出现getOutputStream() has already been called for this response异常的原因和解决方法...
【標? 題】: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 contentType="image/jpeg" import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*,java.io.*" %>
<%!
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);
?
?OutputStream os = response.getOutputStream();
?
?// 在內存中創建圖象
?int width=60, height=20;
?BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
?
?// 獲取圖形上下文
?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(new Color());
?//g.drawRect(0,0,width-1,height-1);
?
?
?// 隨機產生155條干擾線,使圖象中的認證碼不易被其它程序探測到
?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);
?}
?
?// 取隨機產生的認證碼(4位數字)
?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
?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 2009-02-18 13:33 浙林龍哥 閱讀(...) 評論(...) 編輯 收藏轉載于:https://www.cnblogs.com/huqingyu/archive/2009/02/18/1393126.html
總結
以上是生活随笔為你收集整理的tomcat5下jsp出现getOutputStream() has already been called for this response异常的原因和解决方法...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MSN on 2/16/2009
- 下一篇: 指甲之指甲长期没有甲半月弧(二)