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