Gerar imagens dinâmicamente com JSF [Solucionado]

Pessoal,

Como poderia fazer para gerar imagens no meu ManagedBean dinamicamente ?

Eu fiz a imagem sendo gerada em um servlet, mas como estou usando JSF acredito que seja mais correto gerar isso no managedBean certo ? então como fazer isso ???

Veja abaixo como fiz usando o servlet:

Página: index.jsp

<%@page contentType="text/html" pageEncoding="UTF-8"%>

<%@taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@taglib prefix="h" uri="http://java.sun.com/jsf/html"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">

<%--
    This file is an entry point for JavaServer Faces application.
--%>
<f:view>
    <html>
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
            <title>JSP Page</title>
        </head>
        <body>
            <h1><h:outputText value="Imagens Dinamicas"/></h1>
            <p />
            <h:graphicImage id="imagem" value="http://localhost:8084/JsfServlet/novo?nome=marcelo" />
        </body>
    </html>
</f:view>

Servlet: novo.java

package servlet;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class novo extends HttpServlet {

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String s = (request.getParameter("nome"));
        response.setContentType("image/png");
        OutputStream os = response.getOutputStream();
        try {
            int width = 200, height = 200;
            BufferedImage buffer = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            Graphics g = buffer.createGraphics();
            g.setColor(Color.WHITE);
            g.fillRect(0, 0, width, height);
            g.setColor(Color.BLACK);
            g.drawLine(0, 0, width, height);
            Font font = new Font("Courier", Font.BOLD, 30);
            g.setColor(Color.BLUE);
            g.setFont(font);
            g.drawString(s, 0, 20);
            ImageIO.write(buffer, "png", os);
        } finally {
            os.close();
        }
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>
}

Obrigado,

Marcelo Gomes

Você pode fazer assim.
No seu managed bean:

[code]public String seuMetodoNoMBean() {
ExternalContext ectx = FacesContext.getCurrentInstance().getExternalContext();
HttpServletRequest request = (HttpServletRequest)ectx.getRequest();
HttpServletResponse response = (HttpServletResponse)ectx.getResponse();

String s = (request.getParameter("nome"));  
 response.setContentType("image/png");  
 OutputStream os = response.getOutputStream();  
 try {  
     int width = 200, height = 200;  
     BufferedImage buffer = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);  
     Graphics g = buffer.createGraphics();  
     g.setColor(Color.WHITE);  
     g.fillRect(0, 0, width, height);  
     g.setColor(Color.BLACK);  
     g.drawLine(0, 0, width, height);  
     Font font = new Font("Courier", Font.BOLD, 30);  
     g.setColor(Color.BLUE);  
     g.setFont(font);  
     g.drawString(s, 0, 20);  
     ImageIO.write(buffer, "png", os);  
 } finally {  
     os.close();  
 }

return null;

}[/code]

Espero ter ajudado… =)
Abrs.

Biro,
Obrigado pela ajuda, mas ainda não consegui, neste caso o meu método “seuMetodoNoMBean()” vai retornar uma string (sem valor) e este não é o retorno que o h:graphicImage espera em value.

então como ficar o jsp ?

se colocar

< h:graphicImage value="#{MeuBean.SeuMetodoNoMBean}" />

Da erro. então como devo fazer ?

Obrigado,

Marcelo Gomes

Bom, não é necessário que quando se usa JSF TUDO tenha que ser feito pelos Managed Beans. A tag <h:graphicImage> será renderizada como a tag , que recebe como atributo uma url (relativa ou absoluta). Pelo visto você já está mapeando as requisições para o seu servlet usando URL-Pattern do tipo “/nome”.
Se o seu problema for passar o parâmetro para o servlet, ou gerar a url necessária para ser colocada no atributo “value” do <h:graphicImage>, então a minha sugestão é que o seu bean tenha um getter do tipo getUrlDaImagemGeradaDinamicamente(), com o código mais ou menos assim:

public String getUrlDaImagemGeradaDinamicamente()
{
    ServletContext sc = (ServletContext)(FacesContext.getCurrentInstance().getContext());
    String urlMagica = sc.getContextPath() + "novo?nome=" + getNomeDeAlgumLugar();
    return urlMagica;
}

E na sua página fica algo assim:

< h:graphicImage value="#{MeuBean.urlDaImagemGeradaDinamicamente}" /> 

O método ServletContext.getContextPath() retorna “http://localhost:8084/JsfServlet/”. O resto você concatena.

Consegui!!! obrigado

Fiz com o richfaces

       public void paint2(Graphics2D g2d, Object obj) {

           g2d.setBackground(Color.yellow);
           g2d.setColor(Color.red);
           g2d.drawLine(0, 0, 100, 100);

       }

Usando o rich:paint2D

Obrigado pelas dicas Biro /Alexandrehdk

Cara, isso tudo foi dentro do contexto da aplicação correto?

Para imagens fora do contexto é necessário algum tratamento?

Estava analisando, eu poderia renderizar através de uma pasta temporária para a exibição dessa imagem no form.

Qual a opinião de vcs?