에러 내용은 다음과 같습니다.
Servlet.service() for servlet jsp threw exception
java.io.IOException: Stream closed
at org.apache.jasper.runtime.JspWriterImpl.ensureOpen(JspWriterImpl.java:204)
at org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:115)
at org.apache.jasper.runtime.PageContextImpl.release(PageContextImpl.java:188)
at org.apache.jasper.runtime.JspFactoryImpl.internalReleasePageContext(JspFactoryImpl.java:118)
at org.apache.jasper.runtime.JspFactoryImpl.releasePageContext(JspFactoryImpl.java:77)
at org.apache.jsp.index1_jsp._jspService(index1_jsp.java:408)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:388)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Thread.java:722)
... 생략 ...
예외 추적된 내용을 분석해 봅니다.
at org.apache.jasper.runtime.JspWriterImpl.ensureOpen(JspWriterImpl.java:204)
at org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:115)
at org.apache.jasper.runtime.PageContextImpl.release(PageContextImpl.java:188)
at org.apache.jasper.runtime.JspFactoryImpl.internalReleasePageContext(JspFactoryImpl.java:118)
at org.apache.jasper.runtime.JspFactoryImpl.releasePageContext(JspFactoryImpl.java:77)
at org.apache.jsp.index1_jsp._jspService(index1_jsp.java:408)
이 로그는 메소드가 호출되는 스택이 덤프된 것으로 예외가 발생하였을때 어디서 발생을 하였는지 그리고 문제가 발생하게 된 원인이 무엇인지 짐작할수 있는 정보가 됩니다. 순서는 아래에서 위로 분석합니다.
먼저 index.jsp의 408라인에서 JSPFactoryImpl클래스의 releasePageContext 메소드를 호출하고 있으며 JSP에 덧붙여진 코드 즉, JSP페이지 자체에서 호출을 하는겁니다. 그렇다면 작성한 코드는 모두 실행이 된 상태라고 볼수 있습니다.
그럼 왜 오류가 발생했느냐? JSP는 처리가 완료되면 현재 출력 버퍼에 남아있는 데이터를 플러시(Flush)하고, 스트림을 닫게 됩니다.
스택의 맨 위를 보면 ensureOpen() 메소드가 호출되고 있는데 이 메소드는 스트림이 열려있는지 닫혀있는지 확인하게 되는데 이때 스트림이 닫혀 있기에 출력 버퍼에 남아 있는 데이터를 송신하지 못하므로 예외가 발생하게 됩니다.
즉, JSP페이지 내부의 사용자 코드의 처리가 완료되고 스트림을 닫을라 했는데 이미 닫혀서 않되는 것입니다.
해결 방법은 index.jsp 페이지를 열어 잘 확인해 보시면 out.close() 라는 코드가 있을겁니다.
그 코드를 제거하면 문제를 해결할 수 있습니다.
댓글