JFreeChart: una libreria Open Source per la generazione dinamica di grafici

II parte: un esempio completo di applicazione webdi

Secondo di due articoli sulla descrizione delle API di JFreeChart, una libreria Java Open Source che consente la generazione dinamica di grafici a partire da una fonte dati e di esportarli nei formati PNG e JPEG, anche da Servlet. In questa seconda parte analizziamo la realizzazione di una applicazione web che fa uso delle API di JFreeChart per generare un grafico a runtime e che recupera i dati per popolare il grafico da un database via JDBC.

Introduzione

Nel precedente articolo sono state illustrate le caratteristiche principali di JFreeChart ed e‘ stato mostrato un esempio di applicazione Java standalone che utilizzava le API di tale libreria per la generazione di un grafico a partire da un set di dati. Come già  anticipato, JFreeChart può essere utilizzato in Java anche in ambito web. In questa seconda parte dell‘articolo viene quindi descritta un‘applicazione di esempio di questo tipo.

Base dati dell‘applicazione

L‘applicazione descritta in questo articolo genererà , in una Servlet, un output di tipo PNG di un Time Series Chart contenente due curve.
A differenza dell‘esempio della prima parte dell‘articolo, i dati con cui verrà  popolato il grafico verranno recuperati da un database. Quello, molto semplice, utilizzato per l‘esempio e‘ un database MySQL chiamato jfreechart e costituito da una sola tabella, xydata:

CREATE TABLE xydata (id INT NOT NULL AUTO_INCREMENT, refmonth INT, refyear INT, yvalue1 DECIMAL(6,2), yvalue2 DECIMAL(6,2), PRIMARY KEY (id));

I campi della tabella hanno il seguente significato:

  • id = id della tabella;
  • refmonth = mese;
  • refyear = anno; insieme a refmonth viene utilizzato per costruire l‘asse delle ascisse;
  • yvalue1 = valori della prima fra le due curve disegnate nel grafico;
  • yvalue2 = valori della seconda fra le due curve disegnate nel grafico.

La Servlet, chiamata ChartTestServlet, estende javax.servlet.http.HttpServlet. Nel metodo doPost viene invocato il metodo che si occupa della generazione del grafico:

public void doPost( HttpServletRequest request, HttpServletResponse response )throws ServletException, IOException {// Invoca il metodo della classe che genera il GraficoChartMaker lChartMaker = new ChartMaker();JFreeChart lChart = lChartMaker.createChart();

Quindi viene eseguito il rendering del grafico impostando il content type dell‘output della Servlet a image/png e sfruttando il metodo writeChartAsPNG della classe com.jrefinery.chart.ChartUtilities:

// Rendering del grafico in PNGif ( lChart != null ) {response.setContentType( "image/png" );OutputStream out = response.getOutputStream();            ChartRenderingInfo lInfo = new ChartRenderingInfo( new StandardEntityCollection() );ChartUtilities.writeChartAsPNG( out, lChart, 640, 480, lInfo );            out.flush();out.close();}

com.jrefinery.chart.ChartUtilities è la classe JFreeChart che prevede i metodi per il rendering dei grafici nei formati previsti dalla libreria. Il metodo createChart() della classe ChartMaker si occupa della generazione del grafico vera e propria. Tale metodo recupera i dati dalla tabella xydata del database applicativo:

DataRetriever lDataRetriever = new DataRetriever();lDataset = lDataRetriever.getData( "SELECT * FROM xydata" );

e quindi costruisce il grafico in maniera analoga a quanto visto nell‘esempio della prima parte dell‘articolo:

if ( lDataset != null ){lChart = ChartFactory.createTimeSeriesChart("Mokabyte Time Series Example","Date","Valori",lDataset,true,true,false);// Imposta il colore di sfondolChart.setBackgroundPaint( Color.yellow );// Impostazione delle proprietà  del diagrammaXYPlot lXYPlot = (XYPlot)lChart.getPlot();lXYPlot.setBackgroundPaint( Color.lightGray );lXYPlot.setDomainGridlinePaint( Color.white );lXYPlot.setRangeGridlinePaint( Color.white );lXYPlot.setDomainCrosshairVisible( true );lXYPlot.setRangeCrosshairVisible( true ); // Impostazione dell‘asse delle ascisse DateAxis lXYAxis = (DateAxis)lXYPlot.getDomainAxis(); lXYAxis.setDateFormatOverride( new SimpleDateFormat( "MMM-yyyy" ) );}

La classe DataRetriever e‘ quella che si occupa della connessione al database e del recupero dei dati necessari. La connessione avviene tramite driver JDBC MySQL. Il metodo DataRetriever.exeSelect esegue la SELECT sulla tabella xydata e popola l‘istanza di com.jrefinery.data.XYDataset da restituire alla classe ChartMaker per la generazione del grafico:

public XYDataset exeSelect( String pStrSQLSelect ){TimeSeriesCollection lDataset = new TimeSeriesCollection();try{TimeSeries lTimeSeries1 = new TimeSeries( "MokaByte Index", Month.class );TimeSeries lTimeSeries2 = new TimeSeries( "MokaCode Index", Month.class );stmt = conn.createStatement();rs = stmt.executeQuery(pStrSQLSelect);while (rs.next()){lTimeSeries1.add( new Month( rs.getInt( "refmonth" ), rs.getInt( "refyear" ) ), rs.getFloat( "yvalue1" ) );lTimeSeries2.add( new Month( rs.getInt( "refmonth" ),  rs.getInt( "refyear" ) ),  rs.getFloat( "yvalue2" ) );}rs.close();lDataset.addSeries( lTimeSeries1 );lDataset.addSeries( lTimeSeries2 );}catch(SQLException se){System.out.println( "exeSelect(): Impossible eseguire la SELECT" );}return lDataset;}

Esecuzione dell‘applicazione

Per poter essere eseguita, l‘applicazione di esempio necessita di essere installata all‘interno di un Servlet container, quale Jakarta Tomcat. Una volta effettuato il deploy dell‘applicazione e riavviato Tomcat, invocando, da Browser, l‘URL:

http://127.0.0.1:8080/JFreeChartExample2/ChartTestServlet

la Servlet produrrà  un output di questo tipo:

L‘esempio completo è allegato all‘articolo e può essere scaricato dal menu in alto a sinistra

Per generare grafici diversi dai Times Series chart i passi da compiere sono analoghi a quelli di questo esempio.

Conclusioni

In questa seconda parte e‘ stato mostrato che, indipendentemente dal tipo di applicazione Java, la generazione di grafici in maniera dinamica tramite JFreeChart prevede sempre la stessa sequenza di operazioni. Dai due esempi spiegati in questi due articoli si evince che la libreria ben si presta per essere integrata facilmente in applicazioni Java che necessitano della generazione di grafici a runtime anche molto complesse. Inoltre, il grado di personalizzazione dei grafici e‘ molto elevato.

Riferimenti

[1]
David Gilbert "The JFreeChart Class Library - Installation Guide"
http://www.jfree.org/jfreechart/index.php

Condividi

Pubblicato nel numero
108 giugno 2006
Guglielmo Iozzia si è Laureato nel 1999 in Ingegneria Elettronica (indirizzo Biomedico) presso l‘Università di Bologna. Ha progettato e realizzato un software diagnostico per la predizione dell‘andamento della pressione intracranica in pazienti in terapia intensiva neurochirurgica. Frequenta il mondo Java dall‘inizio del 2000. Dopo numerose esperienze presso un‘azienda di Bologna…
Articoli nella stessa serie
Ti potrebbe interessare anche