getOutputStream() has already been called for this response的理解

前言
  • 在做excel导出的时候,使用到了response.getOutputStream(),然后在springmvc的方法中return了一个jsp视图路径出去,导致这个错误。
getOutputStream()是以字节流的方式写出数据
浏览器得有对应的编码表来把字节流解析为字符
而如果又实用getWriter()来以字符的形式写出,
编码变冲突。。所有规范两者不能同时使用
分析
  • 我们都知道jsp的内置对象有一个out,它是通过PageContext.getOut()来获取的,而在j2ee的开发api文档中写有
Calling flush() on the ServletOutputStream commits the response. Either this method or getWriter() may be called to write the body, not both.
调用flush()方法会提交response流,getWriter()getOutPutStream()两者只能被调用一个 
原因
  • 两个流使用的是同一个缓冲区,当缓冲区满后 才会被写出(或手动调用flush写出) 在编译后的jsp类中,有一句:
   if (_jspxFactory != null) _jspxFactory.releasePageContext(_jspx_page_context);}
   释放时会调用response.getWriter()

如果流没有关闭 tomcat会自动关闭,但也提倡手动关闭流,遵循j2ee的开发规范,具体细节只能考虑参看源码分析了,后续查询相关资料再来补充

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值