2013-03-26 3 views
0

MySQL DB에서 pdf를 다운로드하려고합니다. (필자는 Blob로 얻었고 모든 것이 잘 작동합니다.) 프로그래머가 충돌 할 때 ServletOutputstream을 클라이언트에 보내도록 시도하십시오.

AFAIK 메서드를 호출하기 전에 예외가 throw되거나 getwriter 메서드에 throw됩니다. 그러나 코드에서 getwriter 메서드를 사용하지 않습니다. 모든과 programm에있는 다른로 getOutputStream-방법에 도달하지 않습니다에서 (내가 확인을 주석).

Heres는 내 코드 snippe를
(즉, 어떤 이유로 중요한 경우에는 모든 일이 JSP에서 발생) t과 예외 :response.getOutputStream() 처음 호출 할 때 IllegalStateException을 throw합니다.

코드 그것은 참으로 문제가 당신이 JSP에서이 일을하고 있습니다

26.03.2013 09:28:29 org.apache.catalina.core.ApplicationDispatcher invoke 
SCHWERWIEGEND: Servlet.service() for servlet jsp threw exception 
java.lang.IllegalStateException 
    at org.apache.jasper.runtime.ServletResponseWrapperInclude.getOutputStream(ServletResponseWrapperInclude.java:63) 
    at org.apache.jsp.jsp.modules.Testszenario.PostReportResultOverview_jsp._jspService(PostReportResultOverview_jsp.java:115) 
    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:374) 
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342) 
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267) 
    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.ApplicationDispatcher.invoke(ApplicationDispatcher.java:630) 
    at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:535) 
    at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:472) 
    at org.apache.jasper.runtime.JspRuntimeLibrary.include(JspRuntimeLibrary.java:968) 
    at org.apache.jsp.jsp.McFrame_jsp._jspService(McFrame_jsp.java:284) 
    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:374) 
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342) 
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267) 
    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:128) 
    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:286) 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845) 
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) 
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447) 
    at java.lang.Thread.run(Thread.java:619) 

답변

2

응답이 커밋되었는지 확인하십시오. 커밋 된 응답으로 무언가를 시도하면 IllegalStateException이 발생할 수 있습니다. 페이지 버퍼 크기를 초과하면 응답이 커밋됩니다.

+0

맞습니다. 그것이 문제였습니다. 그러나 응답이 JSP 초기에 이미 커밋되었으므로 응답 버퍼에 내용을 변경하거나 아무것도 작성하기 전에 어떻게 변경할 수 있습니까? – olkoza

+0

위의 대답을 참조하십시오. – NilsH

+0

하지만 어떻게 가능합니까? 이 코드를 최소한으로 변경하더라도 : % <% @ page \t import = "com.nundp.util.ResourceHandler, java.util. *, java.io. *, java.sql.Blob"% > <% System.out.println ("start jsp :"+ response.isCommitted()); %> ' 응답이 이미 커밋 되었습니까? – olkoza

1

Blob pdf = null; 
if(request.getParameter("reportId") != null){ 
    pdf = testszenario.getReportErgebnisPdf(Integer.parseInt(request.getParameter("reportId")), request.getParameter("erzeugung")); 
} 
byte[] buf = new byte[(int)pdf.length()]; 
InputStream inputStream = pdf.getBinaryStream(); 
inputStream.read(buf); 
inputStream.close(); 
response.setContentType("application/pdf"); 
response.setHeader("Content-disposition","attachment; filename=test.pdf"); 

ServletOutputStream sos = response.getOutputStream(); 
// response.getOutputStream().write(buf); 

예외입니다. JSP는 웹 응용 프로그램 요청의 출력 렌더링 단계의 일부이므로 컨테이너가 이미 작성기 객체를 가져 왔을 수 있습니다. 대신 코드를 서블릿으로 옮겨보십시오. 작가/스트림에 대한 더 많은 제어권을 제공합니다.

관련 문제