HTTP Servlets tem utilidade mais interessante do que apenas Front Controllers e gerar código HTML. Um dos recursos mais bacanas é a possibilidade de gerar conteúdo binário em tempo de execução. Nesse post demonstrarei como desenhar uma imagem dinâmica utilizando Servlets. A idéia veio da necessidade do Cássio em extrair páginas de PDF e exibir como imagens em uma aplicação Web.
Vamos criar uma Servlet onde o usuário poderá realizar uma requisição via GET da URL "imagem.png" passando um parâmetro "texto" e a Servlet irá retornar uma imagem com uma bolinha e o texto digitado.
Estou utilizando Servlet 3.0, mas o código do método get pode ser utilizado em qualquer outra versão de Servlets sem necessidade de alteração.
package br.com.thiagovespa.samples.imagem; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.IOException; import java.io.OutputStream; import javax.imageio.ImageIO; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Gera uma imagem com um texto passado por parâmetro * * @author Thiago Galbiatti Vespa */ @WebServlet("/imagem.png") public class ImagemServlet extends HttpServlet { private static final long serialVersionUID = 201011231103L; public ImagemServlet() { super(); } @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // A imagem é um png - Poderia ser qualquer outro tipo response.setContentType("image/png"); // Recupera o parâmetro String text = request.getParameter("texto"); // Cria uma imagem de tamanho 500x50 BufferedImage image = new BufferedImage(500, 50, BufferedImage.TYPE_INT_ARGB); // Cria o canvas pra desenho Graphics2D canvas = image.createGraphics(); canvas.setColor(Color.BLUE); // Desenha um círculo azul canvas.fillOval(10, 10, 10, 10); canvas.setColor(Color.RED); canvas.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 14)); // Desenha o texto em vermelho canvas.drawString(text != null ? text : "Nenhum texto informado!", 25, 20); OutputStream out = null; try { out = response.getOutputStream(); // Escreve a imagem no outputstream da response no formato png ImageIO.write(image, "PNG", out); } finally { if (out != null) { out.close(); } } } }
Fiz vários comentários no código para facilitar a compreensão de quem está começando e para eu não precisar explicar linha a linha o que o código está fazendo :). O código importante para gerar qualquer conteúdo binário é o que está destacado na linha 35, que seta o mime-type correto para a servlet exibir e o da linha 56 que recupera o OutputStream (binário) para escrever algum conteúdo nele.
Para utilizar o mime-type correto pro seu tipo de conteúdo, você pode utilizar a tabela da W3School disponível nesse link: http://www.w3schools.com/media/media_mimeref.asp
Agora é só fazer o deploy de um projeto com essa Servlet e acessá-la passando um parâmetro. O resultado você pode ver na imagem abaixo:
Para exibir dentro de uma página HTML é só referenciar o endereço da Servlet no atributo src da tag img. Por exemplo:
<!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>Exemplo imagem</title> </head> <body> Olha minha imagem aí em baixo<br/> <img src="imagem.png?texto=Imagem gerada!"/> </body> </html>
O browser irá exibir o conteúdo da imagem gerada dinâmicamente:
Agora é só programar a Servlet para gerar o que você quiser!.
Esse conceito é utilizado para geração de CAPTCHAs, PDF, XLS, e outros arquivos binários dinamicamente.
[...] This post was mentioned on Twitter by Felipe Albuquerque and Bruno Gualda, Thiago G. Vespa. Thiago G. Vespa said: Novo post: Gerar imagens dinâmicas com servlets http://j.mp/gc3LDf [...]