写输出流时报getOutputStream() has already been called for this response异常

错误信息

java.lang.IllegalStateException: getOutputStream() has already been called for this response
    at org.apache.catalina.connector.Response.getWriter(Response.java:678)
    at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:213)
    at org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:125)
    at org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:118)
    at org.apache.jasper.runtime.PageContextImpl.release(PageContextImpl.java:194)
    at org.apache.jasper.runtime.JspFactoryImpl.internalReleasePageContext(JspFactoryImpl.java:126)
    at org.apache.jasper.runtime.JspFactoryImpl.releasePageContext(JspFactoryImpl.java:80)
    at org.apache.jsp.export_jsp._jspService(export_jsp.java:566)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)

分析问题
其实就是JSP 和Servlet 的输出response.getOutputStream().write,调用两次。首先在页面请求URL时进入控制层程序时,你使用了 response.getOutputStream().write()输出方法,
然后在执行完程序时,你在控制层程序中又一次执行了返回值,那么一个请求方法同时使用了两次response.getOutputStream().write()输出方法。
其实就是因为 JSP 中同时用了 response.getOutputStream() 以及 JSP 内置对象 out.write().因为Serlvet 规范中不能同时使用这两个。只能选其中一个。

所以解决方案
第一种解决方案,在前端重置请求,输出缓存清空一下

<%
    // 同时 reset response 和 清空 out
    response.reset();
    out.clear();
    out = pageContext.pushBody();
%>

第二钟方式

@RequestMapping(value="/download",method=RequestMethod.GET)
public String downloadFile() throws IOException{
	return "url";
}

把上面的代码改成返回值为空,那么在方法代码块中执行的response.getOutputStream() 就只有一次。就不会报相关异常了

@RequestMapping(value="/download",method=RequestMethod.GET)
public void downloadFile() throws IOException{
	执行代码块
}

说得不是很好,需要很好理解的话,请去看相关源码

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值