JFreeChart + JSF (HELP me please)

Olá Pessoal,

Tenho uma appicação em JSF e quero gerar graficos em uma JSP usando JFreeChart sem nenhuma outra taglib.
Bom utilizei uma servlet e consegui renderizar o gráfico na página, a solução que encontrei foi no metodo que retorna a imagem ao inves de retorna-la, o metodo é void e seta a imagem em uma array de byte, pego esse array e jogo na tela o gráfico com a tag <s:graphicImage url=“ChartServlet”> (nome da servlet na url).

O que eu quero fazer agora é utilizar uma atributo do Menage Bean para realizar o mesmo processo para exibir o gráfico chamando a tag <s:graphicImage url="#{chartBean.Charts}"> por exemplo.

Servlet:

[code]
import java.awt.Color;
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartRenderingInfo;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.entity.StandardEntityCollection;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.Plot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.BarRenderer3D;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.data.general.DefaultPieDataset;

public class ChartServlet extends HttpServlet {

/**
 * atributo serial;
 */
private static final long serialVersionUID = -1997245402770915920L;

public void doGet(HttpServletRequest request, HttpServletResponse response) 
	throws ServletException, IOException {
	
   doGeneratePieChart(request,response);
	
}

protected void doGeneratePieChart(HttpServletRequest request, HttpServletResponse response) 
	throws IOException, ServletException {
	
	try {
		
		DefaultPieDataset ds = new DefaultPieDataset();
	        ds.setValue("Norte", 13000000);
	        ds.setValue("Nordeste", 48000000);
	        ds.setValue("Centro-Oeste", 11000000);
	        ds.setValue("Sudeste", 73000000);
	        ds.setValue("Sul", 25500000);
    
	    JFreeChart chart = 
	    	ChartFactory.createPieChart("População Nacional", ds, true, false, false);// create your chart
	    	chart.setBackgroundPaint(Color.white);
	    	
	    ByteArrayOutputStream baos = new ByteArrayOutputStream();
	   
	    ChartRenderingInfo info = new ChartRenderingInfo(new  StandardEntityCollection());
	    
	    ChartUtilities.writeChartAsJPEG(baos, 1.0F, chart,400, 250, info);
        
	    response.setContentType("image/jpg");
        
        OutputStream out = new BufferedOutputStream(response.getOutputStream());
        out.write(baos.toByteArray());
        out.flush();
        out.close();
    } catch (IOException e) {
	    e.printStackTrace();
    }
}

}[/code]

JSP:

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

<%@ taglib prefix=“tiles” uri=“http://struts.apache.org/tags-tiles”%>
<%@ taglib uri=“http://java.sun.com/jsf/core” prefix=“f”%>
<%@ taglib uri=“http://java.sun.com/jsf/html” prefix=“h”%>
<%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c”%>

<html>
<body>
<h:form>
<f:verbatim>
<h:graphicImage url=“ChartServlet”/> // ao em vez de chamar a servlet , chamar o atributo do bean
</f:verbatim>
</h:form>
</body>
</html> [/code]

Alguém tem alguma dica, ajuda?

Obrigado.

Como transformar o servlet no Manage Bean;

Pra fazer algo do tipo(abaixo)…funcionar
Managed Bean

[code]import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.OutputStream;

import javax.imageio.ImageIO;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.data.general.DefaultPieDataset;

public class ChartBean {

public void chart(OutputStream out, Object data) throws Exception {  
  BufferedImage pageImage = gerarGraficoPie();  
  pageImage.flush();
  ImageIO.write(pageImage, "jpeg", out);  
}  

public static BufferedImage gerarGraficoPie() throws Exception {  
  BufferedImage buf = null;  

  try {  
	  DefaultPieDataset ds = new DefaultPieDataset();
		ds.setValue("Norte", 13000000);
		ds.setValue("Nordeste", 48000000);
		ds.setValue("Centro-Oeste", 11000000);
		ds.setValue("Sudeste", 73000000);
		ds.setValue("Sul", 25500000);
		
		JFreeChart chart = 
			ChartFactory.createPieChart("População Nacional", ds, true, false, false);// create your chart
			chart.setBackgroundPaint(Color.white);  
			chart.setBorderVisible(true);  
			chart.setBorderPaint(Color.gray);  

		buf = chart.createBufferedImage(400,250,BufferedImage.TYPE_INT_RGB, null); 
		buf.flush();
    } catch (Exception e) {  
    	throw new Exception(e);    		  
    }  
    
    return buf;  
}  

}[/code]
Assim ainda não funcionou

Aguardo :smiley:

Tentei acessar com mediaOutput e graphicImage ainda não rolou.

JSP : <a4j:mediaOutput/>

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

<%@ taglib uri=“http://java.sun.com/jsf/core” prefix=“f”%>
<%@ taglib uri=“http://java.sun.com/jsf/html” prefix=“h”%>
<%@ taglib uri=“http://richfaces.org/a4j” prefix=“a”%>
<%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c”%>

<html>
<body>
<h:form id=“formChart”>
<f:verbatim>
<h:panelGroup>
<h:panelGrid>
<a:mediaOutput element=“img” cacheable=“false”
session=“true” createContent="#{chartBean.chart}"
mimeType=“image/jpeg”
style=“width: 400px; height: 250px;”/>
</h:panelGrid>
</h:panelGroup>
</f:verbatim>
</h:form>
</body>
</html>[/code]

JSP :<h:graphicImage/>

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

<%@ taglib uri=“http://java.sun.com/jsf/core” prefix=“f”%>
<%@ taglib uri=“http://java.sun.com/jsf/html” prefix=“h”%>
<%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c”%>

<html>
<body>
<h:form id=“formChart”>
<f:verbatim>
<h:panelGroup>
<h:panelGrid>
<h:graphicImage url="#{chartBean.chart}"/>
</h:panelGrid>
</h:panelGroup>
</f:verbatim>
</h:form>
</body>
</html>[/code]

faces-navigation-config.xml

&lt;faces-config&gt; &lt;navigation-rule&gt; &lt;navigation-case&gt; &lt;from-outcome&gt;charts&lt;/from-outcome&gt; &lt;to-view-id&gt;/charts.tiles&lt;/to-view-id&gt; &lt;/navigation-case&gt; &lt;/navigation-rule&gt; &lt;/faces-config&gt;

faces-managedbean-config.xml

&lt;faces-config&gt; &lt;managed-bean&gt; &lt;managed-bean-name&gt;chartBean&lt;/managed-bean-name&gt; &lt;managed-bean-class&gt;br.com.exemple.view.bean.ChartBean&lt;/managed-bean-class&gt; &lt;managed-bean-scope&gt;request&lt;/managed-bean-scope&gt; &lt;/managed-bean&gt; &lt;/faces-config&gt;

tiles-definitions

&lt;tiles-definitions&gt; &lt;!-- ### Mecanismo de Grárficos ### --&gt; &lt;definition name="/charts.tiles"&gt; &lt;put name="body" value="/content/exemple/componentesApresentacao/charts/charts.jsp" /&gt; &lt;/definition&gt; &lt;/tiles-definitions&gt;

Preciso de ajuda…

Abraços.

Tenta passar o BEAN para session.

Fala thokk beleza? Cara meu BEAN esta como session e estou tentando chamar este metodo, porem segundo um exemplo citado por voce antes este mesmo metodo recebe 2 parametros certo? como passo esses dois parametros via JSF? ou melhor, preciso passa-los via jsf?

Vlww cara!

Fiz seu exemplo funcionar assim:

[code]<%@page contentType=“text/html”%>
<%@page pageEncoding=“UTF-8”%>
<%@ taglib uri=“http://java.sun.com/jsf/html"prefix="h” %>
<%@ taglib uri=“http://java.sun.com/jsf/core” prefix=“f” %>
<%@ taglib uri=“https://ajax4jsf.dev.java.net/ajax” prefix=“a4j” %>

<f:view >


<h:form id=“formChart”>
<f:verbatim>
<h:panelGroup>
<h:panelGrid>
<a4j:mediaOutput element=“img” cacheable=“false”
session=“true” createContent="#{graficos.chart}"
mimeType=“image/jpeg”
style=“width: 400px; height: 250px;”/>
</h:panelGrid>
</h:panelGroup>
</f:verbatim>
</h:form>

</f:view>

[/code]

fiz com bean de sessão mesmo

Fala judilson,

Cara obrigado pela força! Consegui resolver esse problema também há algum tempo. Nesse caso não é necessário enviar nenhum parâmetro. É uma característica do servlet.

Abraços!

Fala RenZasso,

Estou com um problema semelhante, eu queria ter acesso ao Bean em escopo View ou Flash no Servlet e não consigo.
Tem alguma dica?

Obrigado,

Titvs

Salve titvs

Tranquilidade? Cara todos os escopos do meus Beans são do tipo Session. Cara ralei demais pra conseguir passar parâmetros com outros escopos, mas nada! Dizem que não é muito legal usar todos os escopos do tipo session, mas foi a única saída que encontrei.

Abraço!

Grande RenZasso,

Se você estiver usando o JSF 2. Você pode usar o escopo View, que o comportamento da sua aplicação não muda, “você não tem que alterar quase nada de código”.
Você pode usar RestBean, mas esse requer muita alteração na sua aplicação.
O bacana do do Bean em escopo de View, é que ele se comporta como a Sessão, só que é destruído quando você redireciona a página. Assim sua aplicação não consome tantos recursos no servidor.
Imagina que sua aplicação tem 20 Bean em Sessão e o usuário entra em um simples cadastro de Ruas… quando ele abre a Sessão, automaticamente os 20 Beans de Sessão são criados.
Deixa para colocar em Sessão, Beans como usuário e login, esses tipos de coisas que todas as Views tem que acessar.
Mas eu gostaria de saber como você pegou o Bean pelo Servlet.
Se você me mostrar eu vou ser eternamente grato.

Abraços,

Titvs