Buscar imagem em JSP e Servlet em paginas geradas pelo servidor

Olá Galera!
Estou com uma dificuldade aqui em inserir imagens nas minhas paginas. Criei uma pagina em .jsp que busca um arquivo do Navegador do cliente… e através de um Servlet salvo em um diretório ("/home/rodrigo/Uploads/imagens/imagem1.jpg") no meu computador, e no mesmo Servlet salvo o diretório no banco de dados. E sei que não ha necessidade de salvar todo diretório no banco, o resto fica em uma variável. Essas partes são bem tranquilas. Estou testando agora, em outra pagina .jsp, buscar e renderizar as imagens no navegador. O endereço no banco e no navegador estão corretos (testei colocando todo o endereço apresentador na renderização do navegador, em uma simples pagina index.html sem o servidor de aplicação, e renderizou normalmente), mas mesmo assim não busca a imagem da pagina gerada pelo servidor. Imagino que possa ser que eu tenho que referenciar esse diretório da imagem em uma URL, para mandar junto com o servidor (TomCat7 ou GlassFish 4.1). Digo isso porque quando coloco imagens na pasta da aplicação (WebContent/imagens/imagem1.jpg) funciona normalmente pelas tags do jsp . E mesmo se eu salvo utilizando os métodos file.getAbsolutePath(), não busca as imagens, e nesse caso, quando o servidor é reiniciado as imagens se perdem, mas essa não é minha dúvida.

Minha duvida é: Como posso renderizar as imagens salvas em um diretório qualquer do meu computador? Tenho que criar uma URL para a imagem? E como faz isso?
Já procurei bastante aqui no forum, google e youtube, mas nenhum resolvia o problema. E também não posso salva a imagem como Blob no banco, esta não seria uma opção. As tecnologias que estou usando são JSP, Servlet, MySQL, Hibernate, TomCat 7, commons-fileupload e commons-io. Não posso usar FrameWorks como JSF, Spring, Struts, Vraptor ou outros. Tem que ser na marra mesmo. Ficarei agradecido se puderem me ajudar.

Este é meu primeiro post, e não tenho experiencia. Alguém poderia me ajudar?

Ao usar uma pasta que está fora do seu servidor, você deve gerar a imagem “na unha”.

Crie um servlet que receba um parâmetro como:
/seu_site/imagens?id=OIASUDOuIQWEUY1827368172638162

Aí você sabe que OIASUDOuIQWEUY1827368172638162 é igual a imagem:
/home/rodrigo/imagens/image33.png

Pq ñ fazer?
/seu_site/imagens?id=image33.png

Se você expor seu ID direto na URL ou até mesmo o path completo, pessoas podem começar a manipular sua URL como
/seu_site/imagens?id=image34.png ou até mesmo /seu_site/imagens?id=/home/rodrigo/codigo_fonte.java

Tentei gerar a imagem “na unha”. Quando foi só uma imagem deu certo usando pagina jsp e o servlet, seguindo o MVC. funcionou da seguinte forma:

Pagina index.jsp:

[code]<%@ page language=“java” contentType=“text/html; charset=UTF-8” pageEncoding=“UTF-8”%>

Exemplo imagem img{ width: 500px; height: 350px; }

Buscando imagens de servlet

[/code]

Servlet BuscarImagem.java:

@WebServlet("/BuscarImagem.png") public class BuscarImagem extends HttpServlet { private static final long serialVersionUID = 1L; @Override public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("image/png"); String diretorio="/home/rodrigo/tomcat/Uploads/Imagens/renderbrink.png"; File imagem2= new File(diretorio); BufferedImage imagem=ImageIO.read(imagem2); OutputStream out=response.getOutputStream(); // Escreve a imagem no outputstream da response NO FORMATO PNG ImageIO.write(imagem,"PNG", out); if (out != null) { out.close(); } } }

Ai eu tentei buscar por uma lista de imagens do banco… mas acho que dessa forma não vai funcionar, pois deu erro e acho que é porque usei recursos PrintWriter out1=response.getWriter(); e OutputStream out2=response.getOutputStream(); ao mesmo tempo.

@WebServlet("/CarregarImagem")
public class CarregarImagem extends HttpServlet {
	private static final long serialVersionUID = 1L;

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.setContentType("text/html");
		PrintWriter out1=response.getWriter();
		OutputStream out2=response.getOutputStream();
		
		ImagemDao imagemDao=new ImagemDao();
		List<Imagem> listaImagens=imagemDao.buscarImagem();
		out1.println("<html>"
				+ "<head>"
				+ "<title>Buscar Imagens</title>"
				+ "</head>"
				+ "<body>"
				+ "<h1>Buscar imagens a partir de um diretorio salvo no banco</h1>");
		for(Imagem imagem1:listaImagens){
			// Retornar diretorios dessa forma /home/rodrigo/tomcat/Uploads/Imagens/renderbrink.png
			String diretorio=imagem1.getDiretorios();
			File imagem2= new File(diretorio);
			BufferedImage imagem=ImageIO.read(imagem2);
			// Escreve a imagem no outputstream da response NO FORMATO PNG
			ImageIO.write(imagem,"PNG", out2);
		}
		out1.println("</body>"
				+ "</html>");
	}
}

A duvida é, Tenho que usar algo do tipo ImageIO.write(imagem,“PNG”, out2)?
O não teria como gerar URLs ou links automáticas, como as imagens desse tipo http://mlb-s2-p.mlstatic.com/computador-completo-core-2-duo-2gb-wifi-garantia-1-ano-217901-MLB20441454943_102015-O.jpg ?
Pois aí eu colocaria

ou

Ao invés de escrever as imagens na página, escreva a URL e deixe que o browser a busque.

Aí vc teria uma URL que mostraria essa página:
/projeto/listaImgs

E ela retornaria algo como

... ...

Nisso o browser vai ir buscar cada imagem.

Em outras palavras: “crie 2 servlets. 1 que vai listar as imagens e outro que vá exibir a imagem”

Mas é ai que tá o problema. Se for só uma pagina index.html ou index.jsp, e eu abrir direto no browser com o diretório:


Funciona normalmente, pois o caminho da imagem esta correto. Mas quando é uma aplicação htttp://localhost:8080/MeuSIte/index.jsp
Esse código não funciona.


nem esse:


Pois minhas imagens estão fora do servidor. E acho que isso que eu fiz não é bem uma URL, apenas caminho local.
E se eu colocasse dentro da aplicação, /WebContent/Imagens/… Funcionaria normal, Pois estaria junto com o servidor.

Ai achei estes post aqui que explicam o meu problema.

http://www.guj.com.br/java/287790-tomcat-imagem-fora-do-webapps
http://www.guj.com.br/java/116905-imagens-fora-do-contexto-da-aplicao
http://www.guj.com.br/java/48587-como-exibir-uma-imagem-fora-do-contexto-da-aplicao-em-um-jsp

Agora que eu comecei entender como funciona, vou fazer aqui. E depois que conseguir, eu posto a solução explicando passo a passo.

Conseguir mapear imagens que estão fora da aplicação do servidor.
Esse código vai ajudar quem estiver com duvidas ao fazer uploads de imagens usando apenas jsp e servlets, e quiser
exibir suas imagens salvas em “diretórios”, no navegador.

Vamos a solução:
Crie o seguinte servlet que vai buscar as imagens em QUALQUER DIRETÓRIO;

// Esse nome será informado depois do nome do seu site
// exemplo http://localhost:8080/seu_site/imagens/nome_da_imagem.extensão
@WebServlet("/imagens/*")
public class ImagensServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	 protected void doGet(HttpServletRequest request, HttpServletResponse response)
			 throws ServletException, IOException {
		// pega o nome do arquivo
	        String nomeImagem = request.getPathInfo().substring(1);
	        // Informa todo o caminho da imagem, junto com o nome da mesma
	        // Lembrando que o diretório e o nome da imagem, poderiam vir de um banco de dados 
	        File imagem = new File("/home/meu_pc_linux/uploads/imagens", nomeImagem);
	        // Saida
	        Files.copy(imagem.toPath(), response.getOutputStream());
	 }
}

Depois é só criar sua pagina jsp que receberá o nome de QUALQUER imagem que estiver dentro da pasta.
No meu caso eu salvei na pasta imagens.

Página index.jsp :

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
		<title>Exibindo uma lista de imagens com JSP e Servlet</title>
	</head>
	<body>
		<style type="text/css">
			img {
				width: 200px;
			}
		</style>
		<h1>Lista de imagens</h1>
		<img src="/seu_site/imagens/imagem_1.png" />
		<img src="/seu_site/imagens/imagem_2.jpg" />
		<img src="/seu_site/imagens/imagem_3.jpg" />
		<img src="/seu_site/imagens/imagem_4.png" />
		<img src="/seu_site/imagens/imagem_5.png" />
		<img src="/seu_site/imagens/imagem_6.jpg" />
		<img src="/seu_site/imagens/imagem_7.png" />
		<img src="/seu_site/imagens/imagem_8.png" />
		<img src="/seu_site/imagens/imagem_9.jpg" />
		<img src="/seu_site/imagens/imagem_10.png" />
		<img src="/seu_site/imagens/imagem_11.jpg" />
	</body>
</html>

Depois de compilar sua aplicação, acesse o endereço
localhost:8080/seu_site/index.jsp
ou o endereço de cada imagem dentro da pasta que estão salvas
localhost:8080/seu_site/imagens/imagem_1.png
localhost:8080/seu_site/imagens/imagem_2.jpg
localhost:8080/seu_site/imagens/imagem_3.jpg
localhost:8080/seu_site/imagens/imagem_4.png
localhost:8080/seu_site/imagens/imagem_5.png
localhost:8080/seu_site/imagens/imagem_6.jpg
localhost:8080/seu_site/imagens/imagem_7.png
localhost:8080/seu_site/imagens/imagem_8.png
localhost:8080/seu_site/imagens/imagem_9.jpg
localhost:8080/seu_site/imagens/imagem_10.png
localhost:8080/seu_site/imagens/imagem_11.jpg

Bom, é uma solução simples, mas que me deu um trabalhão para conseguir fazer a primeira vez. Eu ainda não testei pegando os nomes e diretórios salvos no banco. Mas acredito que vai ajudar que estiver com duvida. Nesse meu outro poste ( http://www.guj.com.br/java/318290-criar-diretorio-virtual ), tem um solução que é gerar diretórios virtuais em uma pasta fora da aplicação, para evitar que apague os arquivos no deploy da aplicação. Mas é só se o servidor for o apache-tomcat.