2014-11-08 53 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

相关问题