Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从oracle sql检索图像并在jsp页面中显示它?_Java_Image_Oracle_Jsp_Servlets - Fatal编程技术网

Java 如何从oracle sql检索图像并在jsp页面中显示它?

Java 如何从oracle sql检索图像并在jsp页面中显示它?,java,image,oracle,jsp,servlets,Java,Image,Oracle,Jsp,Servlets,Servlet代码: 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.h

Servlet代码:

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();
                  }
                  }

    }
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)
问题:

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();
                  }
                  }

    }
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中的图像?
上述方法是从数据库检索图像的正确方法吗?或者有更好的方法吗?

当您声明
out
但似乎不使用它时,您可能应该删除该行

// try below change

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

一旦调用了
getWriter()

,您就不能对响应调用
getOutputStream()
,但是:您不应该使用JDBC/ODBC桥。它速度很慢,已经在Java8中删除了。改用真正的JDBC驱动程序。并且不要在每次请求时打开新连接。改用连接池。虽然这可能会有所帮助,但您是否也应该删除
PrintWriter out=response.getWriter()由于似乎未使用变量,且函数在异常中显式命名?@RavindraBairagi,那么您可能希望接受answer@RavindraBairagi你应该仍然能够接受你所问问题的答案。如果我理解正确,请单击投票计数器下的复选标记。