2014-11-08 55 views
1

servlet代碼:如何從oracle sql檢索圖像並將其顯示在jsp頁面中?

import java.io.*; 
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import javax.servlet.http.HttpSession; 

public class profile_photo extends HttpServlet { 

    /** 
    * The doGet method of the servlet. <br> 
    * 
    * This method is called when a form has its tag value method equals to get. 
    * 
    * @param request the request send by the client to the server 
    * @param response the response send by the server to the client 
    * @throws ServletException if an error occurred 
    * @throws IOException if an error occurred 
    */ 
    public void doGet(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException { 

     response.setContentType("text/html"); 
     PrintWriter out = response.getWriter(); 
     HttpSession ses=request.getSession(); 
     String email = (String)ses.getAttribute("ses_email"); 
     String imgLen=""; 
     Connection cn; 
     PreparedStatement ps; 
     try 
     { 
      Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 
      cn=DriverManager.getConnection("jdbc:odbc:sm","system","gecbsp"); 
      ps=cn.prepareStatement("select photo_loc from smreg3 where email = "+ 
           "'"+email+"'"); 
      ResultSet rs = ps.executeQuery(); 
      if(rs.next()){ 
        imgLen = rs.getString(1); 
        System.out.println(imgLen.length()); 
        } 
      ps=cn.prepareStatement("select photo_loc from smreg3 where email = "+ 
        "'"+email+"'"); 
      ResultSet rs2 = ps.executeQuery(); 
      if(rs2.next()){ 
        int len = imgLen.length(); 
        byte [] rb = new byte[len]; 
        InputStream readImg = rs2.getBinaryStream(1); 
        int index=readImg.read(rb, 0, len); 
        System.out.println("index"+index); 
        ps.close(); 
        response.reset(); 
        response.setContentType("image/jpg"); 
        response.getOutputStream().write(rb,0,len); 
        response.getOutputStream().flush(); 
        } 
        } 
        catch (Exception e){ 
        e.printStackTrace(); 
        } 
        } 

    } 

JSP代碼:

<img src="${pageContext.request.contextPath}/profile_photo" /> 

錯誤:

java.lang.IllegalStateException: getWriter() has already been called for this response 
at org.apache.catalina.connector.Response.getOutputStream(Response.java:573) 
at org.apache.catalina.connector.ResponseFacade.getOutputStream(ResponseFacade.java:183) 
at profile_photo.doGet(profile_photo.java:59) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:690) 
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) 

問題:

如何從ImageServlet中檢索JSP中的圖像? 上述方法是否正確地從數據庫中檢索圖像?或者有更好的方法嗎?

+0

不相關但是:您不應該使用JDBC/ODBC橋。它的運行速度很慢,並已在Java 8中刪除。請改用真正的JDBC驅動程序。並且不要在每個請求上打開新的連接。改用連接池。 – 2014-11-09 06:53:09

回答

0

正如你聲明out但似乎並沒有使用它,你或許應該刪除行

PrintWriter out = response.getWriter(); 

不能調用getOutputStream()上的響應,一旦你做了呼叫getWriter()

+0

非常感謝..它的工作原理。 – 2014-11-24 18:10:56

+0

@RavindraBairagi然後你可能想接受的答案 – TheConstructor 2014-11-24 22:08:20

+0

我不能,我沒有足夠的聲望投票了....但thanx很多.. – 2014-12-06 18:09:01

0
// try below change 

response.setContentType("application/octet-stream"); 
response.setContentLength(len); 
OutputStream outputStream = response.getOutputStream(); 
outputStream.write(rb,0,len);   
outputStream.flush(); 
+0

儘管這可能有所幫助,您是否也不應該刪除'PrintWriter out = response.getWriter();'因爲它似乎沒有使用該變量,並且該函數在異常中顯式命名? – TheConstructor 2014-11-09 07:46:58

相關問題