Tem uma forma melhor de fazer isso, sem componetes pelo menos no caso de campos blob.
Estou desenvolvendo uma aplicação que grava e recupera imagens do banco Oracle. Para exibir a imagem você precisa de um servlet, action (struts) ou jsp que:
- abra uma conexão com o banco
- faça um select na imagem
- peque um stream da imagem
- sete o content do response como image/jpeg
- e retorne os bytes do stream
Na pagina jsp que vai exibir a imagem o segredo é chamar o servlet, action ou pagina jsp que retorna o conteúdo da imagem no campo src da tag html img: , passando o id da foto que será buscada no banco como parâmetro.
Segue um exemplo:
/** getphoto.jsp codigo fonte /
<%@page import="java.sql.,oracle.jdbc.*"%>
<html>
<head>
<title>jsp1</title>
</head>
<table width="781" border="2">
<tr>
<td width="83" bgcolor="#C0C0C0">
PhotoId
</td>
<td width="450" bgcolor="#C0C0C0">
Description
</td>
<td width="228" bgcolor="#C0C0C0">
Photo Image
</td>
</tr>
<%
Connection conn = null;
Statement stmt = null;
ResultSet rset = null;
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
conn = DriverManager.getConnection("jdbc:oracle:thin:@itas:1521:oraITAS","yourDbUserId","yourDbPassword");
stmt = conn.createStatement();
rset = stmt.executeQuery("select photo_id,photo_description from photo");
while (rset.next()) {
%>
<tr>
<td width="83">
<%=rset.getObject("photo_id")%>
</td>
<td width="450">
<%=rset.getObject("photo_description")%>
</td>
<td width="228">
<img src="getimage.jsp?PhotoId=<%=rset.getObject("photo_id")%>" width="238" height="228">
</td>
</tr>
<%
}
conn.close();
%>
</table>
</html>
/** getimage.jsp codigo fonte*/
<%@ page contentType=“image/jpeg; chaoResult=iso-8859-1”
language=“java” import=“java.sql.,java.io.,java.util.*”
errorPage="" %>
<%
String strConnString = null;
Connection oDbConn;
Statement oStmt;
ResultSet oResult;
String strConnection = null;
String strUserId = “c_erober”;
String strUserPwd = “sybdev99”;
String strDatabase = “oraITAS”;
String strPhotoId;
strConnString = “jdbc:odbc:” + strDatabase;
String strSql;
try {
strPhotoId = (String) request.getParameter(“PhotoId”);
strSql = “select photo_image from photo” + ( (strPhotoId==null) ? " where photo_id = ‘001’": (" where photo_id = ‘" + strPhotoId + "’") );
DriverManager.registerDriver(new sun.jdbc.odbc.JdbcOdbcDriver());
oDbConn = DriverManager.getConnection(strConnString,strUserId,strUserPwd);
response.setContentType(“image/jpeg”);
oStmt = oDbConn.createStatement();
oResult = oStmt.executeQuery(strSql);
oResult.next();
byte[] bytearray = new byte[4096];
int size=0;
InputStream sImage;
sImage = oResult.getBinaryStream(1);
response.reset();
response.setContentType(“image/jpeg”);
response.addHeader(“Content-Disposition”,“filename=getimage.jpeg”);
while((size=sImage.read(bytearray))!= -1 ) {
response.getOutputStream().write(bytearray,0,size);
}
response.flushBuffer();
sImage.close();
oDbConn.close();
} catch (SQLException ex) { ex.getMessage();
}
%>
O código acima é bem didático, mas aconselho usar servlets e não páginas jsp para abrir a conexão, fazer consulta ao banco e returnar a imagem.
Espero ter ajudado.