2014-11-06 3 views
-1

JSP 페이지에서 데이터베이스에 저장된 이미지를 표시하려고합니다. 어떻게해야합니까?oracle 데이터베이스에서 JSP로 이미지를 검색하는 방법은 무엇입니까?

다음 JSP 코드를 시도했지만 브라우저에 아무 것도 표시하지 않습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

<% 

     HttpSession ses2=request.getSession(); 
     String email2 = (String)ses2.getAttribute("ses_email"); 
     Connection cn2; 
     PreparedStatement ps2; 
     try 
     { 
     Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 
      cn2=DriverManager.getConnection("jdbc:odbc:sm","system","gecbsp"); 
      ps2=cn2.prepareStatement("select * from smreg3 where email = "+ 
           "'"+email2+"'"); 
      ResultSet rs2=ps2.executeQuery(); 
      //ServletOutputStream sos=response.getOutputStream(); 

     if(rs2.next()) 
     { 
     byte[] bytearray = new byte[1024]; 
     int size=0; 
     InputStream image; 
     image = rs2.getBinaryStream(1); 
     response.reset(); 
     response.setContentType("image/jpeg"); 
     while((size=image.read(bytearray))!= -1) 
     { 
     response.getOutputStream().write(bytearray,0,size); 
     } 
     response.flushBuffer(); 
     image.close(); 
     rs2.close(); 
     } 
     } 
     catch(Exception ee) 
     { 
      ee.printStackTrace(); 
     } 
     %> 

오류 :

java.lang.IllegalStateException 
    at org.apache.catalina.connector.ResponseFacade.reset(ResponseFacade.java:310) 
    at org.apache.jsp.profile_jsp._jspService(profile_jsp.java:193) 
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803) 
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:393) 
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320) 
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803) 
    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:175) 
    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:263) 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844) 
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:584) 
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447) 
    at java.lang.Thread.run(Thread.java:619) 
+0

[둘러보기] (http://stackoverflow.com/tour)를 읽어보십시오. –

+0

@MarkusWMahlberg [대답 B] (http://h2g2.com/entry/A4288584)는 적당히 사용할 수 있으며, 6을 곱하면 9이 될 수 있습니다. –

+0

@ElliottFrisch : 나는 그 대답도 알고있다. 내가 쓴 것처럼 나는 정확한 질문을 원한다. ;) –

답변

0

그냥 서블릿이 코드를 이동하고 당신은 갈 수 있어야한다. 귀하의 경우에는 아마도 JSP가 이미 응답에 헤더 정보를 작성했기 때문에 응답을 직접 사용할 수 없습니다.

서블릿에서 당신의 코드는 다음과 같습니다

공용 클래스 TestServlet 당신은 또한 웹에서 서블릿을 사용할 수 있도록해야합니다 그 후 HttpServlet을 {

@Override 
protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
     throws ServletException, IOException { 
    HttpSession session = req.getSession(); 
    String email = (String)session.getAttribute("ses_email"); 
    Connection cxn; 
    PreparedStatement ps; 
    try { 
     Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 
     cxn = DriverManager.getConnection("jdbc:odbc:sm","system","gecbsp"); 
     ps = cxn.prepareStatement("select * from smreg3 where email = ?"); 
     ps.setString(1, email); // this avoids sql injection 
     ResultSet rs = ps.executeQuery(); 
     if(rs.next()) { 
      InputStream in = rs.getBinaryStream(1); 
      byte[] buffer = copyStream(in); // use a library like Apache commons IO here 
      rs.close(); cxn.close(); 
      resp.setContentType("image/jpeg"); 
      resp.getOutputStream().write(buffer); 
      resp.flushBuffer(); 

     } 
    }catch(Exception e){ 
     e.printStackTrace(); // replace this by a proper logging framework 
    } 
} 

private byte[] copyStream(InputStream in) { 
    // just the copy code from your initial example 
} 

}

을 확장합니다. xml

이와 비슷한 사항은 web.xml의 웹 응용 프로그램 섹션에 나와야합니다.

<servlet-mapping> 
    <servlet-name>downloadServlet</servlet-name> 
    <url-pattern>download</url-pattern> 
</servlet-mapping> 
<servlet> 
    <servlet-name>downloadServlet</servlet-name> 
    <servlet-class>test.TestServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

그런 다음 서블릿은 웹 응용 프로그램 컨텍스트에서/download로 사용할 수 있습니다.

+0

세부 사항을주세요 ... 나는이 분야에서 태어난 새로운 유형입니다. –

+0

코드를 붙일 수 있습니까? –

+0

나는 지금 당장 가고 있습니다. 내일 뭔가를 생각해 낼거야, 거기에 매달려 라! –

관련 문제