가끔씩 나오지만 크게 문제가 되지 않아서 그냥 두었었는데 꽤 유명한 오류인가봅니다.
검색해 보니 많이 나오네요.
jsp 에서 이미지나 다운로드를 처리하기 위해 OutputStream 을 받아서 처리하는데, jsp에서 servlet으로 변환될때 내부적으로 out 객체가 생성된다고 합니다. 그래서 jsp에서 out 객체를 만들면 이후에 생성되는 out과 충돌이 나타나서 이미 호출되었다는 메세지가 나타나는 것이죠.
결론은 out 객체를 생성할 필요가 있다면 서블릿에서 호출하고 jsp에서 호출하지 않으면 됩니다.
하지만 어쩔 수 없이 jsp 에서 out 객체를 생성할 필요가 있다면 out 호출 이전에 다음과 같이 코드를 넣어주면 됩니다.
out.clear();
pageContext.pushBody();
기존의 out 객체를 초기화 해주는 거죠.
그 이후에 새로이 out 객체를 만들면 정상적을 동작합니다.
아래는 이미지 출력 예제 코드입니다.
<%@ page language="java" %>
<%@ page import="java.io.*" %>
<%
InputStream in = request.getInputStream();
int size = request.getContentLength();
String filename = request.getParameter("name");
response.setContentType("image/jpeg");
response.setContentLength(size);
response.setHeader("Content-Disposition", "attachment; fileName=\""+filename+"\";");
response.setHeader("Content-Transfer-Encoding", "binary");
try{
out.clear();
pageContext.pushBody();
byte[] bytes = new byte[1024];
OutputStream os = response.getOutputStream();
while(true){
int red = in.read(bytes, 0, bytes.length);
if(red < 0) break;
os.write(bytes, 0, red);
}
os.flush();
os.close();
in.close();
}catch(IOException e){
e.printStackTrace();
}
%>