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