Recuperar imagem do banco de dados e exibir em jsp

Olá!!
Estou tentando exibir uma imagem que pego do banco, em bytes, e exibi-lá na jsp. Estou usando struts e recupero essa imagem do banco em um array de bytes no meu action-form. Alguém saberia me dizer como faço para exibir esse array de bytes já como imagem na jsp?

Obrigado…

/*
 * ContatoGeneric.java
 * Criado em: 27/05/2006 - 19:37:21
 * Copyright (c) 2006, Misael Silveira
 * All rights reserved.
 */
/**
 * @author Misael Silveira
 * @version $Id: $
 */
package br.unisc.dao.generic;

import java.io.IOException;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.fileupload.FileItem;

import br.unisc.dao.ContatoDAO;
import br.unisc.db.DataBase;
import br.unisc.model.Contato;

public class ContatoGeneric implements ContatoDAO {
	
	public static final int SELECT_BY_NOME 			= 0;
	public static final int SELECT_BY_SOBRENOME 	= 1;
	public static final int SELECT_BY_EMAIL 		= 2;
	public static final int SELECT_BY_CIDADE 		= 3;
	public static final int SELECT_BY_BAIRRO 		= 4;	
	public boolean hasImage = false;
		
	public void save(Contato contato) {
		try {
			
			String sql = "INSERT INTO contato SET " +
					"id_usuario = ?, " +
					"nome = ?, " +
					"sobrenome = ?, " +
					"apelido = ?, " +
					"email = ?, " +
					"tel_residencial = ?, " +
					"tel_trabalho = ?, " +
					"celular = ?, " +
					"endereco = ?, " +
					"bairro = ?, " +
					"cidade = ?, " +
					"cep = ?";
			
			DataBase db = new DataBase();
			Connection conn = db.open();
			PreparedStatement pstm = conn.prepareStatement( sql );
			
			pstm.setInt( 1, contato.getId_usuario() );
			pstm.setString( 2, contato.getNome() );
			pstm.setString( 3, contato.getSobrenome() );
			pstm.setString( 4, contato.getApelido() );
			pstm.setString( 5, contato.getEmail() );
			pstm.setString( 6, contato.getTel_residencial() );
			pstm.setString( 7, contato.getTel_trabalho() );
			pstm.setString( 8, contato.getCelular() );
			pstm.setString( 9, contato.getEndereco() );
			pstm.setString( 10, contato.getBairro() );
			pstm.setString( 11, contato.getCidade() );
			pstm.setString( 12, contato.getCep() );
			//pstm.setBlob( 13, contato.getFoto() );
			
			pstm.execute();
			
			pstm.close();
			conn.close();
			db.close();
			
			
		} catch( SQLException ex ) {
			System.err.println( "Erro ao persistir contato na base de dados!" );
			ex.printStackTrace();
		}

	}

	public void update(Contato contato) {
	try {
			
			String sql = "UPDATE contato SET " +
					"id_usuario = ?, " +
					"nome = ?, " +
					"sobrenome = ?, " +
					"apelido = ?, " +
					"email = ?, " +
					"tel_residencial = ?, " +
					"tel_trabalho = ?, " +
					"celular = ?, " +
					"endereco = ?, " +
					"bairro = ?, " +
					"cidade = ?, " +
					"cep = ? " +
					"WHERE id_contato = ? ";
			
			DataBase db = new DataBase();
			Connection conn = db.open();
			PreparedStatement pstm = conn.prepareStatement( sql );
			
			pstm.setInt( 1, contato.getId_usuario() );
			pstm.setString( 2, contato.getNome() );
			pstm.setString( 3, contato.getSobrenome() );
			pstm.setString( 4, contato.getApelido() );
			pstm.setString( 5, contato.getEmail() );
			pstm.setString( 6, contato.getTel_residencial() );
			pstm.setString( 7, contato.getTel_trabalho() );
			pstm.setString( 8, contato.getCelular() );
			pstm.setString( 9, contato.getEndereco() );
			pstm.setString( 10, contato.getBairro() );
			pstm.setString( 11, contato.getCidade() );
			pstm.setString( 12, contato.getCep() );
			//pstm.setBlob( 13, contato.getFoto() );
			pstm.setInt( 13, contato.getId_contato() );
			
			pstm.execute();
			
			pstm.close();
			conn.close();
			db.close();
			
			
		} catch( SQLException ex ) {
			System.err.println( "Erro ao persistir contato na base de dados!\n" );
			ex.printStackTrace();
		}

	}

	public void delete(int idContato) {
		try {
			String sql = "DELETE FROM contato WHERE id_contato = ?";
			DataBase db = new DataBase();
			Connection conn = db.open();
			PreparedStatement pstm = conn.prepareStatement( sql );
			pstm.setInt(1,  idContato );
			
			pstm.execute();
			
			pstm.close();
			conn.close();
			db.close();
			
			
		} catch ( SQLException ex ) {
			System.err.println("Erro ao remover contato da base de dados!\n");
			ex.printStackTrace();
		}

	}

	@SuppressWarnings("unchecked")
	public List getContatos(boolean ordenados ) {
		ArrayList contatos = new ArrayList();
		
		try {
			String sql = "SELECT " +
					"id_contato, id_usuario, nome, " +
					"sobrenome, apelido, email, tel_residencial, " +
					"tel_trabalho, celular, endereco, bairro, cidade, " +
					"cep from contato";
			if(ordenados) {
				sql += " ORDER BY nome";
			} else {
				sql += " ORDER BY id_contato";
			}
			
			DataBase db = new DataBase();
			Connection conn = db.open();
			PreparedStatement pstm = conn.prepareStatement( sql );
			ResultSet rs = pstm.executeQuery();
			
			while( rs.next() ) {
				Contato contato = new Contato();
				contato.setId_contato( rs.getInt( "id_contato") );
				contato.setId_usuario( rs.getInt( "id_usuario") );
				contato.setNome( rs.getString("nome") );
				contato.setSobrenome( rs.getString( "sobrenome") );
				contato.setApelido( rs.getString("apelido") );
				contato.setEmail( rs.getString("email") );
				contato.setTel_residencial( rs.getString( "tel_residencial" ) );
				contato.setTel_trabalho( rs.getString("tel_trabalho") );
				contato.setCelular( rs.getString( "celular") );
				contato.setEndereco( rs.getString("endereco") );
				contato.setBairro( rs.getString( "bairro") );
				contato.setCidade( rs.getString( "cidade") );
				contato.setCep( rs.getString("cep") );
				//contato.setFoto( rs.getBlob("foto") );
				
				contatos.add( contato );				
				
			}
			rs.close();
			pstm.close();
			conn.close();
			db.close();
		} catch ( SQLException ex ) {
			System.err.println("Erro ao listar contatos!! \n");
			ex.printStackTrace();
		}
		
		return contatos;
	}

	public Contato selectById(int idContato) {
		try {
			String sql = "SELECT " +
				"id_contato, id_usuario, nome, " +
				"sobrenome, apelido, email, tel_residencial, " +
				"tel_trabalho, celular, endereco, bairro, cidade, " +
				"cep from contato WHERE id_contato = ?";
			DataBase db = new DataBase();
			Connection conn = db.open();
			PreparedStatement pstm = conn.prepareStatement( sql );
			
			pstm.setInt(1, idContato );
			
			ResultSet rs = pstm.executeQuery();
			
			if( rs.next() ) {
				Contato contato = new Contato();
				contato.setId_contato( rs.getInt( "id_contato") );
				contato.setId_usuario( rs.getInt( "id_usuario") );
				contato.setNome( rs.getString("nome") );
				contato.setSobrenome( rs.getString( "sobrenome") );
				contato.setApelido( rs.getString("apelido") );
				contato.setEmail( rs.getString("email") );
				contato.setTel_residencial( rs.getString( "tel_residencial" ) );
				contato.setTel_trabalho( rs.getString("tel_trabalho") );
				contato.setCelular( rs.getString( "celular") );
				contato.setEndereco( rs.getString("endereco") );
				contato.setBairro( rs.getString( "bairro") );
				contato.setCidade( rs.getString( "cidade") );
				contato.setCep( rs.getString("cep") );
				//contato.setFoto( rs.getBlob("foto") );
				
				rs.close();
				pstm.close();
				conn.close();
				db.close();
				
				return contato;
			}
			rs.close();
			pstm.close();
			conn.close();
			db.close();

		} catch ( SQLException ex ) {
			System.err.println( "Erro ao executar query! \n" );
			ex.printStackTrace();
		} 
		
		return null;
	}

	@SuppressWarnings("unchecked")
	public List selectContatosByOpcao(int opcao, boolean ordenados, String value) {
		
		ArrayList contatos = new ArrayList();
		
		try {
			String sql = "SELECT " +
					"id_contato, id_usuario, nome, " +
					"sobrenome, apelido, email, tel_residencial, " +
					"tel_trabalho, celular, endereco, bairro, cidade, " +
					"cep from contato WHERE ";
			
			switch( opcao ) {
				case SELECT_BY_NOME: 
					sql += " nome like ?";
					break;
					
				case SELECT_BY_SOBRENOME: 
					sql += " sobrenome like ?";
					break;
										
				case SELECT_BY_EMAIL:
					sql += " email like ?";
					break;
					
				case SELECT_BY_CIDADE:
					sql += " cidade like ?";
					break;
					
				case SELECT_BY_BAIRRO:
					sql += " bairro like ?";
					break;
				
				default:
					sql += " nome like ?";
					break;
			}
			
			if(ordenados) {
				sql += " ORDER BY nome";
			} else {
				sql += " ORDER BY id_contato";
			}
			
			DataBase db = new DataBase();
			Connection conn = db.open();
			PreparedStatement pstm = conn.prepareStatement( sql );
			pstm.setString(1, value + "%" );
			
			ResultSet rs = pstm.executeQuery();
			
			while( rs.next() ) {
				Contato contato = new Contato();
				contato.setId_contato( rs.getInt( "id_contato") );
				contato.setId_usuario( rs.getInt( "id_usuario") );
				contato.setNome( rs.getString("nome") );
				contato.setSobrenome( rs.getString( "sobrenome") );
				contato.setApelido( rs.getString("apelido") );
				contato.setEmail( rs.getString("email") );
				contato.setTel_residencial( rs.getString( "tel_residencial" ) );
				contato.setTel_trabalho( rs.getString("tel_trabalho") );
				contato.setCelular( rs.getString( "celular") );
				contato.setEndereco( rs.getString("endereco") );
				contato.setBairro( rs.getString( "bairro") );
				contato.setCidade( rs.getString( "cidade") );
				contato.setCep( rs.getString("cep") );
				//contato.setFoto( rs.getBlob("foto") );
				
				contatos.add( contato );				
				
			}
			rs.close();
			pstm.close();
			conn.close();
			db.close();
		} catch ( SQLException ex ) {
			System.err.println("Erro ao listar contatos!! \n");
			ex.printStackTrace();
		}
		
		return contatos;
	}
	
	public void insereImagem( int idContato, FileItem item ) {
		try {
			String sql = "UPDATE contato SET foto = ? " +
			"WHERE id_contato = ? ";
			DataBase db = new DataBase();
			Connection conn = db.open();
			PreparedStatement pstm = conn.prepareStatement( sql );
			/*
			File imagem = new File( path );
			FileInputStream imagemStream = new FileInputStream( imagem );*/
			pstm.setBinaryStream(1, item.getInputStream(), (int) item.getSize() );
			pstm.setInt( 2, idContato );
			pstm.executeUpdate();
			pstm.close();
			conn.close();
			db.close();
		} catch( SQLException ex ) {
			System.err.println("Erro ao tentar inserir imagem!!\n");
			ex.printStackTrace();
		} catch (IOException e) {
			System.err.println("Erro ao inserir InputStream no banco!\n");
			e.printStackTrace();
		}
	}
	
	public byte[] selectImagem( int idContato ) {
		byte[] imagemStream = null;
		try {
			String sql = "SELECT foto, LENGTH(foto) as 'tamanho' FROM contato WHERE id_contato = ?";
			DataBase db = new DataBase();
			Connection conn = db.open();
			PreparedStatement pstm = conn.prepareStatement( sql );
			pstm.setInt(1, idContato );
			ResultSet rs = pstm.executeQuery();
			while( rs.next() ) {
				Blob imagem = rs.getBlob( "foto" );
				if( imagem != null ) {
					hasImage = true;
					imagemStream = imagem.getBytes(1, (int) imagem.length() );
				} else {
					hasImage = false;
				}
			}
			rs.close();
			pstm.close();
			conn.close();
			db.close();
		} catch( SQLException ex )  {
			System.err.println("Erro ao selecionar imagem!! \n" );
			ex.printStackTrace();
		} catch (Exception ex) {
			System.err.println("Erro geral!! \n");
			ex.printStackTrace();
		}
		return imagemStream;
	}

}

Readapta essa pra tuas nescessidades…

[code]
import java.awt.;
import java.awt.image.
;
import com.sun.image.codec.jpeg.*;

import br.unisc.dao.generic.ContatoGeneric;

/**

  • Servlet implementation class for Servlet: GeraImagem

*/
public class GeraImagem extends javax.servlet.http.HttpServlet {

private static final long serialVersionUID = 1L;

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	ContatoGeneric gc = new ContatoGeneric();
	byte[] imagemStream = gc.selectImagem( Integer.parseInt( request.getParameter("idContato") ) );
	if( gc.hasImage ) {
		response.setContentType( "image/jpeg" );
		OutputStream out = response.getOutputStream();
		out.write( imagemStream );
		out.flush();
		out.close();
	} else {
		String texto = "Contato sem foto!";
		response.setContentType( "image/jpeg" );
		int width = 157;
	    int height = 50;
	    BufferedImage image = new BufferedImage(
	      width, height, BufferedImage.TYPE_INT_RGB);

	     Graphics2D g = (Graphics2D)image.getGraphics();

	     g.setColor(Color.black);
	     g.fillRect(0, 0, width, height);

	     g.setColor(Color.green);
	     g.setFont(new Font("Dialog", Font.BOLD, 16));
	     g.drawString(texto,10,height/2+4);

	     g.setColor(Color.black);
	     g.drawRect(0,0,width-1,height-1);

	     g.dispose();

	     ServletOutputStream sos = response.getOutputStream();
	     JPEGImageEncoder encoder =
	       JPEGCodec.createJPEGEncoder(sos);
	     encoder.encode(image);
	}
}  	  	  	    

}[/code]