Posted on 2010-04-22 11:57
leekiang 閱讀(380)
評(píng)論(0) 編輯 收藏 所屬分類:
jsp,servlet
今天做一個(gè)jsp的驗(yàn)證碼程序,把驗(yàn)證碼的繪制寫在一個(gè)jsp里,發(fā)現(xiàn)在調(diào)用時(shí)總是出現(xiàn)getOutputStream() has already
been called for this response異常,搞得一頭霧水,看似自己重復(fù)調(diào)用了,因?yàn)樵诔绦蜃詈笫沁@樣輸出的
ImageIO.write(image, “JPEG”, response.getOutputStream());
但是仔細(xì)檢查了程序,并沒有問(wèn)題,不過(guò)最后還是解決了,問(wèn)題出在%>與<%之間的空行,把換行都去掉就OK了。
因?yàn)锳pplication
Server在處理編譯jsp時(shí)對(duì)于%>和<%之間的內(nèi)容一般是原樣輸出,而且默認(rèn)是PrintWriter,而你卻要進(jìn)行流輸
出:ServletOutputStream,這樣做相當(dāng)于試圖在Servlet中使用兩種輸出機(jī)制,就會(huì)發(fā)生getOutputStream()
has already been called for this response的錯(cuò)誤
詳細(xì)請(qǐng)見《More Java Pitfill》一書的第二部分 Web層Item 33:試圖在Servlet中使用兩種輸出機(jī)制 270
而且如果有換行,對(duì)于文本文件沒有什么問(wèn)題,但是對(duì)于其它格式,比如AutoCAD、Word、Excel等文件
下載下來(lái)的文件中就會(huì)多出一些換行符0×0d和0×0a,這樣可能導(dǎo)致某些格式的文件無(wú)法打開,有些也可以正常打開。