java getwriter_java.lang.IllegalStateException: getWriter()

java.lang.IllegalStateException:

getWriter() has already been called for this response

这个错误纠缠了一个下午。郁闷死了。网上都是这么说的。

在jsp向页面输出图片的时候,使用response.getOutputStream()会有这样的提示:java.lang.IllegalStateException:getOutputStream()

has already been called for this response,会抛出Exception

原因一:

JSP默认的输出流为PrintWriter ,即

%>以外的东西所默认的输出方式,如果你尝试在JSP中使用ServletOutputStream就会引起错误.要嘛直接改用Servlet输出(复写service方法),要嘛删除除%>

对于这样的情况应该这样来解决,删除%>

原因二:

在J2EE的API参考里有这么个:

ServletResponse的getWriter()方法里会抛出这个异常,

IllegalStateException - if the getOutputStream method has already

been called

for this response object

而它的getOutputStream()方法里会抛出这个异常.

IllegalStateException - if the getOutputStream method has already

been called for this response object

并且两者的函数申明里都有这么样的一句

Either this method or getOutputStream() may be called to write the

body, not both.

Either this method or getWriter() may be called to write the body,

not both.

以上说明也解释了为什么在往页面中写入图片的时候要使用如下循环格式

OutputStream output=response.getOutputStream();

while((len=in.read(b)) >0)

{

output.write(b,0,len); }

output.flush();

而不是把response.getOutputStream().write()放到循环体内

我一直找不到代码哪里出问题了。后来出现的问题更搞笑了。

dzxd.gif

/>

src="../upload/attach/dzxd.gif" />

第一个图片能显示,第二个图片不显示。而且提示上面的错误。后来才想到upload这类路径一般是要被过滤的,后来终于找到门路了,在过滤类里面是

String url = ((HttpServletRequest)

request).getRequestURI();

HttpSession session =

((HttpServletRequest) request).getSession();

PrintWriter out = ((HttpServletResponse)

response).getWriter();

// if(

session.getAttribute("UserID") == null )

// out.print("Access

Denied!");

// else

{

boolean

isDirectory = false;

if

(url.endsWith("/"))

isDirectory

= true;

else {

String[]

dir = url.split("/");

if

(dir[dir.length - 1].indexOf(".") < 0)

isDirectory

= true;

}

if

(isDirectory) {

out.print("Access

Denied!"); }

else {

chain.doFilter(request,

response);

}

}

表黑的地方大家就可以发现问题了,前面定义了out但是后面没有关闭。这就是上面的大家分析的原因了。后来将代码改为:第一句黑色的改成PrintWriter

out = null;

第二句里面改成out = ((HttpServletResponse) response).getWriter();

out.print("Access

Denied!");

out.flush();

out.close();

out

= null;

即当需要过滤的时候才进行初始化out,然后用完以后flush,close,null嘿嘿。终于搞定了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值