getOutputStream()異常的原因和解決方法
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內的所有空格和回車符號所有都刪除掉),
在使用完輸出流以后調用以下兩行代碼即可:
最后這里是一個輸出彩色驗證碼例子(這樣的例子幾乎隨處可見)
imag.jsp
在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" %>
- <%!
- ColorgetRandColor( int fc, int bc){
- Randomrandom= 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 ;
- BufferedImageimage= new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
- OutputStreamos=response.getOutputStream();
- Graphicsg=image.getGraphics();
- Randomrandom= new Random();
- g.setColor(getRandColor( 200 , 250 ));
- g.fillRect( 0 , 0 ,width,height);
- g.setFont( new Font( "TimesNewRoman" ,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);
- }
- StringsRand= "" ;
- for ( int i= 0 ;i< 4 ;i++){
- Stringrand=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 (IllegalStateExceptione)
- {
- System.out.println(e.getMessage());
- e.printStackTrace();
- }%>
來自:http://jessdy.javaeye.com/blog/187448
- 原始代碼:
- <%@pagecontentType= "text/html;charset=GBK" %>
- <%@pageautoFlush= "false" %>
- <%@page import = "java.sql.*" %>
- <%@page import = "java.io.*" %>
- <%@page import = "java.util.*" %>
- <%@page import = "java.awt.*" %>
- <%@page import = "java.awt.image.*" %>
- <%@page import = "com.sun.image.codec.jpeg.*" %>
- <%@page import = "com.sun.image.codec.jpeg.*" %>
- <%@page import = "com.csland.common.util.*" %>
- <%!
- public void noImg(ServletOutputStreamoutStream){
- try {
- int width= 80 ,height= 50 ;
- BufferedImageimage= new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
- Graphicsg=image.getGraphics();
- //以下填充背景顏色
- g.setColor(Color.WHITE);
- g.fillRect( 0 , 0 ,width,height);
- g.setColor(Color.ORANGE);
- g.drawRect( 0 , 0 ,width- 1 ,height- 1 );
- Stringrandom= "random" ;
- //以下設置前景色
- g.setColor(Color.BLACK);
- g.drawString( "沒有簽名圖" , 0 , 25 );
- g.dispose();
- //
- JPEGImageEncoderencoder=JPEGCodec.createJPEGEncoder(outStream);
- encoder.encode(image);
- outStream.flush();
- //outStream.close();
- } catch (Exceptione){
- Log.fetal( "atnoImginsig2.jsp:/n" +e);
- }
- }
- public void noImg(HttpServletResponseresponse){
- try {
- ServletOutputStreamoutStream=response.getOutputStream();
- noImg(outStream);
- } catch (Exceptione){
- Log.fetal( "atnoImginsig2.jsp:/n" +e);
- }
- }
- %>
- <%
- out.clear();
- response.setContentType( "image/jpeg" );
- response.addHeader( "pragma" , "NO-cache" );
- response.addHeader( "Cache-Control" , "no-cache" );
- response.addDateHeader( "Expries" , 0 );
- int id=StrUtil.StrToInt(request.getParameter( "id" ));
- if (id<= 0 )
- {
- noImg(response);
- }
- else
- {
- java.sql.Connectionconn= null ;
- java.sql.Statementstmt= null ;
- java.sql.ResultSetlobDetails= null ;
- try {
- conn=DBUtil.getConn();
- stmt=conn.createStatement();
- lobDetails=stmt.executeQuery(
- "SELECTSignatureFROMOZ_Member" +
- "WHEREMemberID=" +id+ "" );
- if (lobDetails.next()){
- BlobmapBlob=lobDetails.getBlob( 1 );
- if (mapBlob!= null ){
- InputStreamblobStream=mapBlob.getBinaryStream();
- Log.debug( "blobStream:" +blobStream);
- ServletOutputStreamoutStream=response.getOutputStream();
- byte []buffer= new byte [ 10 * 1024 ];
- int nbytes= 0 ;
- int allBytes= 0 ;
- while ((nbytes=blobStream.read(buffer))!=- 1 ){
- outStream.write(buffer, 0 ,nbytes);
- allBytes+=nbytes;
- }
- Log.debug( "allBytes:" +allBytes);
- if (allBytes< 1 ){
- Log.debug( "allBytes2:" +allBytes);
- noImg(outStream);
- } else {
- outStream.flush();
- //outStream.close();
- }
- blobStream.close();
- } else {
- noImg(response);
- }
- } else {
- noImg(response);
- }
- }
- catch (Exceptione){
- Log.fetal(e);
- }
- finally {
- try {lobDetails.close();} catch (Exceptione){}
- try {stmt.close();} catch (Exceptione){}
- try {conn.close();} catch (Exceptione){}
- }
- }
- %>
- 修改后的代碼===============byyanleigis
- <%@pagecontentType= "text/html;charset=GBK" %>
- <%@pageautoFlush= "false" %>
- <%@page import = "java.sql.*" %>
- <%@page import = "java.io.*" %>
- <%@page import = "java.util.*" %>
- <%@page import = "java.awt.*" %>
- <%@page import = "java.awt.image.*" %>
- <%@page import = "com.sun.image.codec.jpeg.*" %>
- <%@page import = "com.sun.image.codec.jpeg.*" %>
- <%@page import = "com.csland.common.util.*" %>
- <%!
- public void noImg(ServletOutputStreamoutStream){
- try {
- int width= 80 ,height= 50 ;
- BufferedImageimage= new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
- Graphicsg=image.getGraphics();
- //以下填充背景顏色
- g.setColor(Color.WHITE);
- g.fillRect( 0 , 0 ,width,height);
- g.setColor(Color.ORANGE);
- g.drawRect( 0 , 0 ,width- 1 ,height- 1 );
- Stringrandom= "random" ;
- //以下設置前景色
- g.setColor(Color.BLACK);
- g.drawString( "沒有簽名圖" , 0 , 25 );
- g.dispose();
- //
- JPEGImageEncoderencoder=JPEGCodec.createJPEGEncoder(outStream);
- encoder.encode(image);
- outStream.flush();
- outStream.close();
- } catch (Exceptione){
- Log.fetal( "atnoImginsig2.jsp:/n" +e);
- }
- }
- public void noImg(HttpServletResponseresponse){
- try {
- ServletOutputStreamoutStream=response.getOutputStream();
- noImg(outStream);
- } catch (Exceptione){
- Log.fetal( "atnoImginsig2.jsp:/n" +e);
- }
- }
- %>
- <%
- out.clear();
- out=pageContext.pushBody();
- response.setContentType( "image/jpeg" );
- response.addHeader( "pragma" , "NO-cache" );
- response.addHeader( "Cache-Control" , "no-cache" );
- response.addDateHeader( "Expries" , 0 );
- int id=StrUtil.StrToInt(request.getParameter( "id" ));
- if (id<= 0 )
- {
- noImg(response);
- }
- else
- {
- java.sql.Connectionconn= null ;
- java.sql.Statementstmt= null ;
- java.sql.ResultSetlobDetails= null ;
- try {
- conn=DBUtil.getConn();
- stmt=conn.createStatement();
- lobDetails=stmt.executeQuery(
- "SELECTSignatureFROMOZ_Member" +
- "WHEREMemberID=" +id+ "" );
- if (lobDetails.next()){
- BlobmapBlob=lobDetails.getBlob( 1 );
- if (mapBlob!= null ){
- InputStreamblobStream=mapBlob.getBinaryStream();
- Log.debug( "blobStream:" +blobStream);
- ServletOutputStreamoutStream=response.getOutputStream();
- byte []buffer= new byte [ 10 * 1024 ];
- int nbytes= 0 ;
- int allBytes= 0 ;
- while ((nbytes=blobStream.read(buffer))!=- 1 ){
- outStream.write(buffer, 0 ,nbytes);
- allBytes+=nbytes;
- }
- Log.debug( "allBytes:" +allBytes);
- if (allBytes< 1 ){
- Log.debug( "allBytes2:" +allBytes);
- noImg(outStream);
- } else {
- outStream.flush();
- //outStream.close();
- }
- blobStream.close();
- } else {
- noImg(response);
- }
- } else {
- noImg(response);
- }
- response.flushBuffer();
- out.clear();
- out=pageContext.pushBody();
- }
- catch (Exceptione){
- Log.fetal(e);
- }
- finally {
- try {lobDetails.close();} catch (Exceptione){}
- try {stmt.close();} catch (Exceptione){}
- try {conn.close();} catch (Exceptione){}
- }
- }
- %>
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
