java.lang.IllegalStateException: getOutputStream() has already been call_Android, Python及开发编程讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Android, Python及开发编程讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 2166 | 回复: 0   主题: java.lang.IllegalStateException: getOutputStream() has already been call        下一篇 
    本主题由 koei123 于 2015-7-26 22:50:08 移动
wzj
注册用户
等级:新兵
经验:67
发帖:64
精华:0
注册:2011-11-15
状态:离线
发送短消息息给wzj 加好友    发送短消息息给wzj 发消息
发表于: IP:您无权察看 2015-7-16 15:40:41 | [全部帖] [楼主帖] 楼主

在jsp向页面输出图片的时候,使用response.getOutputStream()会有这样的异常错误提示信息:

java.lang.IllegalStateException: getOutputStream() has already been called for this response

解决办法:
把所有%>和<%之间的空格、换行都删除掉

【原因】:
因为Application Server在处理编译jsp时对于%>和<%之间的内容通过PrintWriter输出(包括HTML标签,空格,回车等通过浏览器生成的标识符),而在上面的例子又要进行流输出:ServletOutputStream,这样做相当于试图在Servlet中使用两种输出机制,
就会发生:getOutputStream() has already been called for this response的错误


例如:<%int i%>

<%int a%>应该写成:<%int i%><%int a%>这样的

jsp都需要编译成servlet才能运行,本质上就是一个class,可以在%Tomcat Home%/work/Catalina/localhost对应于网站根路径的目录找到这个.java,可以看到里面其实已经用了PrintWriter out = response.getWriter();或者类似的语句,这里面已经调用了一次getOutputStream().

所以如果需要获得outputstream,一种方法就是servlet,还有一种就是可以直接引用out这个变量。不过这种做法只是一种投机的方法(万一在jsp编译出来的servlet变量名不是out就麻烦了),所以直接的方法还是servlet。
编写servlet不是很难,只要extends HttpServlet这个类,实现类中未实现的接口,在web.xml中加入url映射就行了。直接用Myeclipse IDE或者JBuilder等IDE实现更简单,只要明白原理就不难。


--转自 北京联动北方科技有限公司

该贴由koei123转至本版2015-7-26 22:50:08



赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论