Monday, November 10, 2014

Create and display dynamic Chart in JSP using Database inputs(jFreeChart Library)

 JSP code that generates chart of database(Time-Speed  which was my application requirement) and returns chart image whenever called

<%// required packages  %>

<%@ page import="java.awt.Image" %>

<%@ page import="java.awt.*"%>

<%@ page import="java.text.SimpleDateFormat"%>

<%@ page import="java.awt.BasicStroke"%>

<%@ page import ="org.jfree.ui.ApplicationFrame"%>

<%@ page import="java.io.*" %>

<%@ page import="java.io.File"%>

<%@ page import="org.jfree.chart.*" %>

<%@ page import="org.jfree.chart.axis.*" %>

<%@ page import="org.jfree.chart.entity.*" %>

<%@ page import="org.jfree.chart.labels.*" %>

<%@ page import="org.jfree.chart.plot.*" %>

<%@ page import="org.jfree.chart.renderer.category.*" %>

<%@ page import="org.jfree.chart.urls.*" %>

<%@ page import="org.jfree.data.category.*" %>

<%@ page import="org.jfree.data.general.*" %>

<%@ page import="org.jfree.data.time.Minute"%>

<%@ page import="org.jfree.data.time.Hour"%>

<%@ page import="org.jfree.data.time.TimeSeries"%>

<%@ page import="org.jfree.data.time.TimeSeriesCollection"%>

<%@ page import="org.jfree.data.xy.XYDataset"%>

<%@ page import="org.jfree.chart.plot.XYPlot"%>

<%@ page import="org.jfree.chart.renderer.xy.StandardXYItemRenderer"%>

<%@ page import="org.jfree.chart.renderer.xy.XYItemRenderer"%>

 <%@ page import=  "java.sql.Connection" %>

<%@ page import  ="java.sql.DriverManager" %>

<%@ page import = "java.sql.SQLException" %>

<%@ page import = "java.sql.PreparedStatement" %>

<%@ page import = "java.sql.ResultSet" %>

<%@ page import = "java.sql.Statement" %>

 <%@ page import=  "javax.servlet.*" %>

<%@ page import  ="javax.servlet.http.*" %>



<%@ page import="java.awt.image.BufferedImage"%>

<%

 try

 {

 File image = File.createTempFile("image", "tmp");



 //chart class instance

Fms fm = new Fms("Graph");



JFreeChart chart = fm.createChart(fm.dataset);

 ChartUtilities.saveChartAsPNG(image, chart, 500, 400);

//get input stream

 FileInputStream fileInStream = new FileInputStream(image);

//output stream foe returning chart as image

 OutputStream outStream = response.getOutputStream(); 

 long fileLength;

 byte[] byteStream;

 fileLength = image.length();

 byteStream = new byte[(int)fileLength];

//read chart image

 fileInStream.read(byteStream, 0, (int)fileLength);

//returns chart image whenever called

 response.setContentType("image/png");

 response.setContentLength((int)fileLength);

 response.setHeader("Cache-Control","no-store,no-cache, must-revalidate, post-check=0, pre-check=0");

 response.setHeader("Pragma", "no-cache");

 fileInStream.close();

 outStream.write(byteStream);

 outStream.flush();

 outStream.close();

 }

 catch (IOException e)

 {

 System.err.println("Problem occurred creating chart.");

 }

%>

<%! public class Fms extends ApplicationFrame {   

//Main class

   XYDataset dataset= null;

   public Fms(final String title) {

        super(title);

      dataset= createDataset();

        final JFreeChart chart = createChart(dataset);

        final ChartPanel chartPanel = new ChartPanel(chart);

        chartPanel.setPreferredSize(new java.awt.Dimension(700, 570));

        chartPanel.setMouseZoomable(true, false);

        setContentPane(chartPanel);

    } 

//chart creation method

   JFreeChart createChart(final XYDataset dataset) {

        final JFreeChart chart = ChartFactory.createTimeSeriesChart(

            "Speed Chart",

            "Time",

            "Speed",

            dataset,

            true,

            true,

            false

        );

        chart.setBackgroundPaint(Color.white);

       final XYPlot plot = chart.getXYPlot();

        plot.setBackgroundPaint(Color.lightGray);

        plot.setDomainGridlinePaint(Color.white);

        plot.setRangeGridlinePaint(Color.white);

        plot.setDomainCrosshairVisible(true);

        plot.setRangeCrosshairVisible(false);

        final XYItemRenderer renderer = plot.getRenderer();

        if (renderer instanceof StandardXYItemRenderer) {

            final StandardXYItemRenderer rr = (StandardXYItemRenderer) renderer;

            rr.setShapesFilled(true);

            renderer.setSeriesStroke(0, new BasicStroke(1.0f));

            renderer.setSeriesStroke(1, new BasicStroke(1.0f));

           }       

        final DateAxis axis = (DateAxis) plot.getDomainAxis();

        axis.setDateFormatOverride(new SimpleDateFormat("dd:MM")); 

        try{

        final ChartRenderingInfo info = new ChartRenderingInfo

(new StandardEntityCollection());

final File file1 = new File("c:/Documents and Settings/accounts/WebApplication2/web/barchart.png");

ChartUtilities.saveChartAsPNG(file1, chart, 600, 400, info);

        }catch(Exception e){}

        return chart;

    }   

//data set generation method

    private XYDataset createDataset() {

        final TimeSeriesCollection dataset = new TimeSeriesCollection();

        dataset.setDomainIsPointsInTime(true);       

        final TimeSeries s1 = new TimeSeries("Series 1", Minute.class);

         int str = 0;

         int i =0,j= 0 ;

         String str1 = null;

        try{             

      Class.forName("sun.jdbc.odbc.JdbcOdbc"); 

      Connection con=DriverManager.getConnection("jdbc:odbc:FMSDB",null,null);

      PreparedStatement st;   

      Statement stmt = con.createStatement(); 

      String query = "Select * from Job_Status";

      stmt.executeQuery(query);

       ResultSet rs = stmt.executeQuery(query);       

           while( rs.next() )

        {                 

         str1= rs.getString("Time");

         String sa = str1.substring(11,13);

         String ha = str1.substring(14,16);

        str= rs.getInt("Speed"); 

        j=Integer.parseInt(sa);

        i=Integer.parseInt(ha);

        String date = rs.getString("Date");

        String y = date.substring(0,4);

         String m = date.substring(5,7);

          String d = date.substring(8,10);

         s1.add(new Minute(i, j, Integer.parseInt(d), Integer.parseInt(m), Integer.parseInt(y)), str);

          }

          }

          catch(Exception e)

          {             

          }

         System.out.println(str1.substring(11,13));

          System.out.println(str1.substring(14,16)+"\t"+str1);                 

        dataset.addSeries(s1);   

        return dataset;

    }

    }

%>
HTML Code for calling this JSP file
exp.jsp is the name of above jsp code file in my application
<html>

<body>

<img src="exp.jsp" alt="Progress chart" />

</body>

</html>
Note: To implement this code you will need jFreeChart Library from jFree Org.

No comments:

Post a Comment