- 浏览: 406405 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
锦毛鼠:
嗯!不错哦,先支持一下!
MySQL-Front 5 注册码 -
bolan392:
我公司现在也想用这个工具,对于商业用户所使用的版本在国内该如何 ...
IP端口扫描工具(Tenable Nessus)的简介 -
exe:
如果目录结果不变,ant其实也不需要怎么修改,直接copy。
Maven 和 ANT 的区别 -
wx3957156:
wx3957156 写道灰常好!灰常好!
利用Java生成静态HMTL页面的方法收集 -
wx3957156:
灰常好!灰常好!
利用Java生成静态HMTL页面的方法收集
getOutputStream() has already been called for this response异常的原因和解决方法
- 博客分类:
- Java编程
getOutputStream() has already been called for this response异常的原因和解决方法 收藏
<script type="text/javascript"> document.body.oncopy = function() { if (window.clipboardData) { setTimeout(function() { var text = clipboardData.getData("text"); if (text && text.length>300) { text = text + "\r\n\n本文来自CSDN博客,转载请标明出处:" + location.href; clipboardData.setData("text", text); } }, 100); } } </script><script class="blogstory">function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}</script>
1.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 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
原因一:
JSP默认的输出流为PrintWriter ,即<%
%>以外的东西所默认的输出方式,如果你尝试在JSP中使用ServletOutputStream就会引起错误.要嘛直接改用Servlet输出
(复写service方法),要嘛删除除%><%中的任何东西
(包括HTML标签,空格,回车等东西)应该就可以。
对于这样的情况应该这样来解决,删除%><%之间的所有内容包括空格和换行符,最后也要消除空格和换行符,
最好再加上一句response.reset()。
原因二:
在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.
Either this method or getWriter() 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
org.apache.catalina.connector.Response.getWriter(Response.java:604)
org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:198)
org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:125)
org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:118)
评论
加了你说的那两行代码果真解决了问题....谢谢
呵呵,不谢不谢~~
加了你说的那两行代码果真解决了问题....谢谢
发表评论
-
tomcat配置多个端口
2011-11-10 01:52 755http://wenku.baidu.com/view/762 ... -
读取文件方法大全
2010-04-14 09:47 704[Java]读取文件方法 ... -
java Excel 操作例子
2010-03-16 10:43 7911. package excel.jxl; ... -
2种方法遍历HashMap
2010-03-15 17:32 669可以通过2种方法遍历HashMap Map map = ... -
读取Properties文件六种方法
2010-03-12 10:50 6511。使用java.util.Properties类的load( ... -
StringBuffer 与 StringBuilder
2010-03-11 09:50 725StringBuffer 与 StringBuilder 中的 ... -
java的System.getProperty()方法可以获取的值
2010-03-08 17:28 704java的System.getProperty()方法可以获取 ... -
UUID生成随机编号(适用于数字字母混编)
2010-02-21 15:34 1626UUID(Universally Unique Ident ... -
随机产生任意位数的数字编号代码
2010-02-21 15:12 1245随机生成任意位数的编号,适用于各种商品编号。 不知道有没有更 ... -
利用Java生成静态HMTL页面的方法收集
2010-01-11 15:12 1832利用Java 生成静态HMTL ... -
jkmount不转发给TOMCAT处理
2009-12-21 11:01 3069jkmount不转发给TOMCAT处理 在网站开发中 ... -
Java Web开发中你一定会遇到的问题
2009-12-20 12:16 2691Java Web开发中,有许多 ... -
div在IE和火狐中居中处理
2009-12-18 09:34 2202#mainBody{ width: 960p ... -
IE处理含中文Json出错处理
2009-12-17 10:50 1169开发中遇到后台传递的含有中文的JSON数据到FF中没有任何问题 ... -
javascript在IE和firefox里的中文兼容问题
2009-12-06 12:39 1369针对firefox与IE对中文的编码处理不一致,IE总是以IS ... -
解决 Javascript的中文乱码问题
2009-12-06 10:56 704public static String getUTF8Str ... -
java 获得北京当前时间
2009-11-10 11:22 1345java 获得北京当前时间。 ... -
Javascript 判断日期 格式
2009-08-06 15:24 1108function isValidDate(str) { ... -
Javascript 判断日期 格式
2009-08-06 15:20 755function isValidDate(str) { ... -
Javascript 判断日期 格式
2009-08-06 15:19 715function isValidDate(str) { ...
相关推荐
NULL 博文链接:https://javal.iteye.com/blog/1993903
1.在tomcat6.0下jsp出现getOutputStream() has already been called for this response异常的原因和解决方法 在tomcat6.0下jsp中出现此错误一般都是在jsp中使用了输出流(如输出图片验证码,文件下载等),没有...
纠结了半天的 java.lang.IllegalStateException: getOutputStream() has already。这个问题困扰了半天,在网上查阅了大量资料 出这个错误一般就是下面2个.....
验证码出现getOutputStream() has already been called for this response错误解决
解决了getOutputStream() has already been called for this response. 并将产生验证码的逻辑从JSP页面中分离出来,单独写了一个类 便于重用。
NULL 博文链接:https://nethub2.iteye.com/blog/2023937
servlet的response可以对返回的内容和格式进行一些设置。
Returns a boolean indicating whether the named response header has already been set. contextDestroyed(ServletContextEvent) - Method in interface javax.servlet.ServletContextListener Notification ...
* This method is called when a form has its tag value method equals to get. * * @param request the request send by the client to the server * @param response the response send by the server ...
getWriter() 和Response.getOutputStream冲突
随机获取验证码 public class CheckNumberServlet extends HttpServlet { ... ServletOutputStream sos = response.getOutputStream();…………………………………………………………………………………………
public void code(HttpServletRequest request, HttpServletResponse response) throws IOException{ String[] tableNames = new String[]{};... IOUtils.write(data, response.getOutputStream()); }
上面两句就是建立缓冲并把原始的字节流转变为Unicode可以操作,而原始的字节流来源于Socket的两个方法,getInputStream()和getOutputStream()方,分别用来得到输入和输出,那么现在有了基本的模型和基本的操作工具...
heads是excel表头,datalist是数据public void createExcelStream(HttpServletResponse response,String filename,String[] heads,List[]> datalist){ try{ OutputStream os = response.getOutputStream();...
import java.io.*; import java.util.*; import javax.servlet.*; ... public class MyServlet ... OutputStream out_Stream = response.getOutputStream(); out_Stream.write( data ); out_Stream.close(); } }
在table中导出Excel详细过程OutputStream os = response.getOutputStream(); response.setContentType("application/msexcel"); response.setHeader("Content-disposition","attachment; filename=clerkAddress.xls...
OutputStream outs = response.getOutputStream();// 获取文件输出IO流 BufferedOutputStream bouts = new BufferedOutputStream(outs); response.setContentType("application/x-download");// 设置response...
用与java web 开发,java 实现的数字验证码的生成 class Image{} *" %> //设置页面不缓存 response.setHeader("Pragma","No-cache");...ImageIO.write(image.creatImage(), "JPEG", response.getOutputStream()); %>
VC6.0 实现jpeg图像的读取