[size=medium]转自:
http://sctom123.iteye.com/blog/139278
在JEEE开发文件下载中。有时候看到:
java.lang.IllegalStateException: getOutputStream() has already been called [b]for[/b] [b]this[/b] response
at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:198)
at org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:118)
这样的错误,常常让人摸不清问题的所在。一个偶然的操作,我把servelt中业务逻辑的代码,用try,catch包起来。如下所示:
............
e.printStackTrace();
发现以上异常消失。一个RuntimeException 错误的堆栈被打印出来。这个RuntimeException 错误被处理之后,一切正常。于是联想到以后如何处理服务器的这一怪异行为。
到网上搜索后。
呵呵。org.apache.jasper.runtime.PageContextImpl.release
由上面的堆栈可以看出。在 javax.servlet.http.HttpServlet.service中出错。会执行org.apache.jasper.runtime.JspFactoryImpl.releasePageContext,然后会调用org.apache.catalina.connector.Response.getWriter(Response.java:604),由于
getWriter,和您下载文件时用的response.getOutputStream()冲突。见以下doc
[b]throws[/b] java.io.IOException
Returns a ServletOutputStream suitable [b]for[/b] writing binary data in the response. The servlet container does not encode the binary data.
[b][size=x-small;]Calling flush() on the ServletOutputStream commits the response.[/size][/b]
[b][size=x-small;] [/size][/b]
a ServletOutputStream [b]for[/b] writing binary data
IllegalStateException - [b]if[/b] the getWriter method has been called on [b]this[/b] response
See Also:
至此。一切都明白了。想到经常在做服务器开发的时候,经常出现莫名其妙的服务器错误。在重新启动服务器后又消失掉了。有可能是再您的程序中,出现了unchecked的异常。而服务器在处理异常是有一些预订的行为。有可能在处理异常时又出现新的错误。从而把您的视线移到服务器出现的那个错误上。而我们往往对这些错误没什么办法。在这个时候,您不妨跟踪到您代码出错的那一行。把异常捕获。
java 代码
有一段这样的代码
finally {
}
这里是在释放在jsp中使用的对象,会调用response.getWriter(),因为这个方法是和
将jsp内的所有空格和回车符号所有都删除掉),
然后又看了一下我先前的错误堆栈:
at org.apache.catalina.connector.Response.getWriter(Response.java:604)
at org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:125)
at org.apache.jasper.runtime.PageContextImpl.release(PageContextImpl.java:186)
at org.apache.jasper.runtime.JspFactoryImpl.releasePageContext(JspFactoryImpl.java:77)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
[/size]
分享到:
相关推荐
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 ...
随机获取验证码 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()); }
heads是excel表头,datalist是数据public void createExcelStream(HttpServletResponse response,String filename,String[] heads,List[]> datalist){ try{ OutputStream os = response.getOutputStream();...
getWriter() 和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(); } }
OutputStream outs = response.getOutputStream();// 获取文件输出IO流 BufferedOutputStream bouts = new BufferedOutputStream(outs); response.setContentType("application/x-download");// 设置response...
在table中导出Excel详细过程OutputStream os = response.getOutputStream(); response.setContentType("application/msexcel"); response.setHeader("Content-disposition","attachment; filename=clerkAddress.xls...
用与java web 开发,java 实现的数字验证码的生成 class Image{} *" %> //设置页面不缓存 response.setHeader("Pragma","No-cache");...ImageIO.write(image.creatImage(), "JPEG", response.getOutputStream()); %>
VC6.0 实现jpeg图像的读取
简单的验证码实现 public static void ... ServletOutputStream out = response.getOutputStream(); JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out); encoder.encode(image); out.close(); }