java.lang.IllegalStateException: getOutputStream() has already been called for this response
09-Feb-201506:29:40.263SEVERE[ajp-apr-8009-exec-3]org.apache.coyote.ajp.AjpMessage.pr...
09-Feb-2015 06:29:40.263 SEVERE [ajp-apr-8009-exec-3] org.apache.coyote.ajp.AjpMessage.processHeader Invalid message received with signature 18245
09-Feb-2015 10:09:27.784 SEVERE [http-apr-80-exec-18] org.apache.catalina.core.ApplicationDispatcher.invoke Servlet.service() for servlet jsp threw exception
java.lang.IllegalStateException: getOutputStream() has already been called for this response
at org.apache.catalina.connector.Response.getWriter(Response.java:578)
经过跟踪程序,发现JSP中用这段报的原因
<%@ page import="org.apache.commons.codec.binary.Base64"%>
<%for(int i=0;i<pageData.getRows().size();i++){
Fbsp u=pageData.getRows().get(i);
String picPath=new String( Base64.encodeBase64(u.getFbspYh().getBytes("utf-8")));
%>
<a href="<%=path %>/dd/commodity/detailPage/<%=u.getFbspId() %>" target="_parent"><img class="pic" alt="全年最低价!" src="<%=path %>/back/fbsp/viewPic/<%=picPath %>"></a>
<%}%>
中的src="<%=path %>/back/fbsp/viewPic/<%=picPath %>“。这段是输出图片用的,页面上加载10几个图,每个图在200k左右,是在页面没全部加载完时,又刷新页面造成的,不知道如何解决 展开
09-Feb-2015 10:09:27.784 SEVERE [http-apr-80-exec-18] org.apache.catalina.core.ApplicationDispatcher.invoke Servlet.service() for servlet jsp threw exception
java.lang.IllegalStateException: getOutputStream() has already been called for this response
at org.apache.catalina.connector.Response.getWriter(Response.java:578)
经过跟踪程序,发现JSP中用这段报的原因
<%@ page import="org.apache.commons.codec.binary.Base64"%>
<%for(int i=0;i<pageData.getRows().size();i++){
Fbsp u=pageData.getRows().get(i);
String picPath=new String( Base64.encodeBase64(u.getFbspYh().getBytes("utf-8")));
%>
<a href="<%=path %>/dd/commodity/detailPage/<%=u.getFbspId() %>" target="_parent"><img class="pic" alt="全年最低价!" src="<%=path %>/back/fbsp/viewPic/<%=picPath %>"></a>
<%}%>
中的src="<%=path %>/back/fbsp/viewPic/<%=picPath %>“。这段是输出图片用的,页面上加载10几个图,每个图在200k左右,是在页面没全部加载完时,又刷新页面造成的,不知道如何解决 展开
展开全部
如果你用了OutputStream,而web容器生成的servlet代码中有out.write(””),这个和JSP中调用的response.getOutputStream()冲突。
out.write()这个是字符流,而response.getOutputStream()是字节流,你不能在同一个页面中调用多个输出流。无论先调用哪一个,在调用第二个时都会抛出IllegalStateException,因为在jsp中,out变量是通过response.getWriter得到的。
在多个使用了outputStream的<%%>语句之间不能有空格及多余的字符。
也就是页面中除了使用了outputStream的<%%>之外不能有空格或其它任何字符,在之内的语句可以有空格及回车。
在JSP页面做输出的时候有两种方式.一是通过JspWriter,另一个是通过OutputStream,但二者互相排斥.如果并存的话就会报告以上异常.
在不得不使用OutputStream的时候.我们必须要把JspWriter舍弃掉了。
找到请求异常的页面所对应的Servlet..把其中所有使用JspWriter的语句全部去掉.或者是到你的JSP文件里把动态输出的代码注释掉.这里注意换行和空格制表符均为JspWriter输出.应该一起去掉.保存文件重新启动服务器你会发现上述异常消失了。
由于jsp container在处理完成请求后会调用releasePageContet方法释放所用的PageContext object,并且同时调用getWriter方法,由于getWriter方法与在jsp页面中使用流相关的getOutputStream方法冲突,所以会造成这种异常,
解决办法是:只需要在jsp页面的最后加上两条语句:
out.clear();
out=pageContext.pushBody();
即可(其中out,pageContext均为jsp内置对象!) 。
out.write()这个是字符流,而response.getOutputStream()是字节流,你不能在同一个页面中调用多个输出流。无论先调用哪一个,在调用第二个时都会抛出IllegalStateException,因为在jsp中,out变量是通过response.getWriter得到的。
在多个使用了outputStream的<%%>语句之间不能有空格及多余的字符。
也就是页面中除了使用了outputStream的<%%>之外不能有空格或其它任何字符,在之内的语句可以有空格及回车。
在JSP页面做输出的时候有两种方式.一是通过JspWriter,另一个是通过OutputStream,但二者互相排斥.如果并存的话就会报告以上异常.
在不得不使用OutputStream的时候.我们必须要把JspWriter舍弃掉了。
找到请求异常的页面所对应的Servlet..把其中所有使用JspWriter的语句全部去掉.或者是到你的JSP文件里把动态输出的代码注释掉.这里注意换行和空格制表符均为JspWriter输出.应该一起去掉.保存文件重新启动服务器你会发现上述异常消失了。
由于jsp container在处理完成请求后会调用releasePageContet方法释放所用的PageContext object,并且同时调用getWriter方法,由于getWriter方法与在jsp页面中使用流相关的getOutputStream方法冲突,所以会造成这种异常,
解决办法是:只需要在jsp页面的最后加上两条语句:
out.clear();
out=pageContext.pushBody();
即可(其中out,pageContext均为jsp内置对象!) 。
追问
感谢兄弟,我加上那两句后报这个错误了
Stacktrace:
Caused by: java.io.IOException: Error: Attempt to clear a buffer that's already been flushed
at org.apache.jasper.runtime.JspWriterImpl.clear(JspWriterImpl.java:142)
追答
flushed试图去清空缓存,但是缓存已经被刷新了
out.clear();
无法执行,具体要看jsp是如何写的了。。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询