-1

In a JSP page, I want to display an image stored in a database. How do I do this?

I tried the following JSP code but it displays nothing in the browser. What am I doing wrong?

<%

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

Error:

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)
Jean-François Corbett
  • 37,420
  • 30
  • 139
  • 188

1 Answers1

0

Just move this code to a Servlet and you should be good to go. In your case the response cannot be used directly since probably the JSP has already written header information into the response.

In Servlet your code would look like this:

public class TestServlet extends 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
}

}

After that you will also need to make the Servlet available in your web.xml

Something like this needs to go into your web-app section of 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>

Then the servlet is available as /download inside your web-app context.

Matthias Steinbauer
  • 1,786
  • 11
  • 24