jsp에서 엑셀파일을 다운로드하는 로직을 구현했다.
이전에 작성된 코드를 보니 finally 부분에 아래 코드가 있었다.
왜 outputStream을 비워주고 다시 선언해줘야 하는지 궁금해서 알아보았다.
out.clear();
out = pageContext.pushBody();
jsp에서 다른 jsp에 있는 페이지를 호출해서 다운로드 로직을 실행하는 경우 이미 stream이 열려 있는 상태이다.
따라서 추가적으로 스트림을 열려고 하면 이미 스트림이 존재한다는 에러메세지가 아래와 같이 뜨게 된다.
Servlet.service() for servlet jsp threw exception
java.lang.IllegalStateException: getOutputStream() has already been called for this response
jsp 페이지는 기본적으로 outputstream이 out이란 객체에 정의가 되어있다. 그래서 jsp에서 새로운 outputstream을 생성하면 오류가 나는 것이다!
그래서 추가적인 stream을 생성하지 않고 기존에 있는 스트림을 이용하기 위해서
기존 스트림을 비우고 새로운 객체를 선언해줘야 한다.
즉, 페이지의 정보를 보내는 부분을 초기화하는 작업을 해주는 것이다.
out.clear(); //스트림을 비운다.
out = pageContext.pushBody(); //다운로드 관련 jsp에 대한 내용을 저장한다.
위와 같이 작성해주면 끝!!
출처
'Java > 정리' 카테고리의 다른 글
ServletOutputStream (0) | 2022.06.24 |
---|---|
[java] tomcat 버전 오류 (0) | 2022.04.05 |
[Java] 파일 다운로드할 때 파일명 지정하는 방법 (0) | 2022.03.29 |
[eclipse] A java Runtime Environment(JRE) or Java Development Kit(JDK) must be available in order to run Eclipse. (0) | 2022.01.09 |
[Java] 파일 출력 방법들 (0) | 2021.12.23 |