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左右,是在页面没全部加载完时,又刷新页面造成的,不知道如何解决
展开
 我来答
anglewang98
推荐于2017-10-06 · TA获得超过535个赞
知道小有建树答主
回答量:420
采纳率:80%
帮助的人:285万
展开全部
如果你用了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内置对象!) 。
追问
感谢兄弟,我加上那两句后报这个错误了
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是如何写的了。。
yyy521fyy
2015-02-13 · TA获得超过3485个赞
知道大有可为答主
回答量:5392
采纳率:25%
帮助的人:3551万
展开全部
你好,可以将jsp改为servlet即可解决!
更多追问追答
追问
没明白,能说具体点吗?
JSP怎么改成SERVLET?? 能给出个例子不,我学习下,谢谢兄弟
追答
因为jsp最终还是编译为servlet的,所以jsp里面的某些方法会冲突,导致了你现在的问题。
如果你会servlet的话,把你的代码拷到servlet里面执行就可以了!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式