在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
1.在tomcat6.0下jsp出现getOutputStream() has already been called for this response异常的原因和解决方法 在tomcat6.0下jsp中出现此错误一般都是在jsp中使用了输出流(如输出图片验证码,文件下载等),没有妥善处理好的原因。 具体的原因就是: 复制代码 代码如下: 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 j=0;j<4;j++){ 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*j+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(); } %> 如有不足之处,欢迎斧正! 2.getOutputStream() has already been called for this response问题的解决 在jsp向页面输出图片的时候,使用response.getOutputStream()会有这样的提示:java.lang.IllegalStateException:getOutputStream() has already been called for this response,会抛出Exception 原因一: 原因二: 在J2EE的API参考里有这么个: ServletResponse的getWriter()方法里会抛出这个异常: IllegalStateException - if the getOutputStream method has already been called for this response object 而它的getOutputStream()方法里会抛出这个异常: IllegalStateException - if the getOutputStream method has already been called for this response object 并且两者的函数申明里都有这么样的一句 Either this method or getOutputStream() may be called to write the body, not both.
复制代码 代码如下: OutputStream output=response.getOutputStream(); while((len=in.read(b)) >0) { output.write(b,0,len); } output.flush(); 而不是把response.getOutputStream().write()放到循环体内 在页面中直接写: 复制代码 代码如下: <body bgcolor="#ffffff">
<h1> <% response.getOutputStream(); %> </h1> </body> 将会出现错误消息如下: java.lang.IllegalStateException: getOutputStream() has already been called for this response 以上就是tomcat6下jsp出现getOutputStream() has already been called for this response异常的原因和解决方法的全部内容,希望能给大家一个参考,也希望大家多多支持极客世界。 |
请发表评论