解决jsp页面直接取流显示多个图片时getOutputStream和getWriter()冲突问题

本文探讨了在Tomcat5环境下使用JSP时遇到的getOutputStream()hasalreadybeencalledforthisresponse异常现象,主要原因是输出流处理不当。文章详细解释了异常产生的根本原因,并提供了一种使用Image对象逐个加载图片的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

tomcat5下jsp出现getOutputStream() has already been called for this response异常的原因和解决方法

在tomcat5下jsp中出现此错误一般都是在jsp中使用了输出流(如输出图片验证码,文件下载等), 
没有妥善处理好的原因。具体的原因就是 在tomcat中jsp编译成servlet之后在函数_jspService(HttpServletRequest request, HttpServletResponse response)的最后 有一段这样的代码 

finally { 
      if (_jspxFactory != null) _jspxFactory.releasePageContext(_jspx_page_context); 
    } 
这里是在释放在jsp中使用的对象,会调用response.getWriter(),因为这个方法是和 
response.getOutputStream()相冲突的!所以会出现以上这个异常。

开始我用的是直接img 标签的src属性里直接放一个地址从ftp直接取图片流,但是循环取多张图片的时候会出现这个异常,单个图片不会有问题

ajax循环的话也不行,之后大佬帮我写了一个方法用的 Image()对象onload一个个载入就好了

html页面

<c:forEach items="${imgUrlList}" var="imgUrl">
<div>
<input type="hidden" id="${imgUrl.id}" imgname="${imgUrl.name}" name="recordAddress" value="${imgUrl.recordAddress}"/>
</div>
<hr>

</c:forEach>

js代码

function onloadImg(){
$('input[name=recordAddress]').each(function(index){
if(index == 0){
var obj=new Image();
var id = $(this).attr("id");
var imgname = $(this).attr("imgname");
obj.src='${ctx}/bm/student/bmStudents/getPhoto?photoURL='+$(this).val();
obj.onload=function(){
$('#'+id).after("<label>"+imgname+"</label><br><img style='width: auto;height: auto;max-width: 70%;max-height: 70%;' src='"+obj.src+"' />");
$("#"+id).remove();
onloadImg();
}
}
});

}

document.ready后调用就可以了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值