怎么在jsp页面里面实现动态的统计图
JSP页面中嵌入动态图表的两种方法 :在JSP页面中插入Applet小程序 ;通过JavaBean动态生成图像。
JSP是一种广泛应用的网页设计技术 ,它是一种HTML和Java脚本混合的编程技术 ,它结合了HTML的静态特性和Java语言的动态能力 ,因此用它进行动态网页设计非常方便。在进行图像处理时 ,一般处理静态图片非常容易 ,但是 ,在实际应用中常常需要动态地在网页中生成二维的图形.
基于JFreeChart开发的一个时序图的绘制。代码如下:
实例中createDataset()方法用于创建数据集合对象。时序图的数据集合与其他数据集合不同,它需要添加一个时间段内的所有数据,通常采用TimeSeries类进行添加。该实例中通过Math类的random()方法进行随机生成。
import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.io.BufferedInputStream;import java.io.DataInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.net.URL;import java.net.URLConnection;import java.text.DateFormat;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date;import java.util.Random;
import javax.swing.JApplet;import javax.swing.Timer;
import org.jfree.chart.*;import org.jfree.chart.annotations.CategoryTextAnnotation;import org.jfree.chart.axis.CategoryAnchor;import org.jfree.chart.axis.CategoryAxis;import org.jfree.chart.axis.CategoryLabelPositions;import org.jfree.chart.axis.DateAxis;import org.jfree.chart.axis.DateTickUnit;import org.jfree.chart.axis.DateTickUnitType;import org.jfree.chart.axis.ValueAxis;import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;import org.jfree.chart.plot.CategoryPlot;import org.jfree.chart.plot.PlotOrientation;import org.jfree.chart.plot.XYPlot;import org.jfree.chart.renderer.category.BarRenderer;import org.jfree.chart.title.TextTitle;import org.jfree.data.category.CategoryDataset;import org.jfree.data.category.IntervalCategoryDataset;
import org.jfree.chart.axis.NumberAxis;import org.jfree.data.category.DefaultCategoryDataset;import org.jfree.data.gantt.Task;import org.jfree.data.gantt.TaskSeries;import org.jfree.data.gantt.TaskSeriesCollection;import org.jfree.data.time.Day;import org.jfree.data.time.Second;import org.jfree.data.time.TimeSeries;import org.jfree.data.time.TimeSeriesCollection;import org.jfree.data.xy.XYDataset;
public class shixutu extends JApplet {
//PLOT_FONT是一静态的字体常量对象,使用此对象可以避免反复用到的字体对象被多次创建 private static final Font PLOT_FONT = new Font("黑体", Font.ITALIC , 18); JFreeChart chart;
//创建数据动态更新的监听 class DataGenerator extends Timer implements ActionListener { private static final long serialVersionUID = 3977867288743720504L; String equID; //设备ID号 int totalTask; //任务数 String[][] strTask; //任务情况
public void actionPerformed(ActionEvent actionevent) { addTotalObservation(); } DataGenerator() { super(1000, null); addActionListener(this); System.out.println("super"); } } //将更新的数据添加到chart中 private void addTotalObservation() { System.out.println("addTotalObservation"); //设置新的数据集 chart.getXYPlot().setDataset(createDataset()); //通知Jfreechart 数据发生了改变,重新绘制柱状图 if (chart != null) { chart.fireChartChanged(); } } private static void processChart(JFreeChart chart) { //设置标题字体 chart.getTitle().setFont(new Font("隶书", Font.BOLD, 26)); //设置背景色 chart.setBackgroundPaint(new Color(252,175,134)); XYPlot plot = chart.getXYPlot(); //获取图表的绘制属性 plot.setDomainGridlinesVisible(false); //设置网格不显示 //获取时间轴对象 DateAxis dateAxis = (DateAxis) plot.getDomainAxis(); dateAxis.setLabelFont(PLOT_FONT); //设置时间轴字体 //设置时间轴标尺值字体 dateAxis.setTickLabelFont(new Font("宋体",Font.PLAIN,12)); dateAxis.setLowerMargin(0.0); //设置时间轴上显示的最小值 //获取数据轴对象 ValueAxis valueAxis = plot.getRangeAxis(); valueAxis.setLabelFont(PLOT_FONT); //设置数据字体 DateFormat format = new SimpleDateFormat("mm分ss秒"); //创建日期格式对象 //创建DateTickUnit对象 DateTickUnit dtu = new DateTickUnit(DateTickUnitType.SECOND,30,format); dateAxis.setTickUnit(dtu); //设置日期轴的日期标签 } //将结果输出在文件中
private static void writeChartAsImage(JFreeChart chart) { FileOutputStream fos_jpg = null; try { fos_jpg = new FileOutputStream("D:\\test\\shixutu.jpg"); ChartUtilities.writeChartAsJPEG(fos_jpg, 1, chart, 400, 300, null); } catch (Exception e) { e.printStackTrace(); } finally { try { fos_jpg.close(); } catch (Exception e) { } } } //创建数据集合对象 public static XYDataset createDataset() { //实例化TimeSeries对象 TimeSeries timeseries = new TimeSeries("Data"); Second second = new Second(); //实例化Day double d = 50D; //添加一年365天的数据 for (int i = 0; i < 500; i++) { d = d + (Math.random() - 0.5) * 10; //创建随机数据 timeseries.second(day, d); //向数据集合中添加数据 second = (Second) second.next(); } TimeSeriesCollection timeSeriesCollection = new TimeSeriesCollection(timeseries); //返回数据集合对象 return timeSeriesCollection; } //Applet程序初始化
public void init() { // 1. 得到数据 XYDataset dataset = createDataset(); // 2. 构造chart chart = ChartFactory.createTimeSeriesChart( "时序图示范", // 图表标题 "时间", // 目录轴的显示标签--横轴 "数值", // 数值轴的显示标签--纵轴 dataset, // 数据集 false, false, // 是否生成工具 false // 是否生成URL链接 ); // 3. 处理chart中文显示问题 processChart(chart); // 4. chart输出图片 //writeChartAsImage(chart); // 5. chart 以swing形式输出 //6.使用applet输出 ChartPanel chartPanel = new ChartPanel(chart); chartPanel.setPreferredSize(new java.awt.Dimension(800,500)); getContentPane().add(chartPanel); (new DataGenerator()).start(); } public void paint(Graphics g) { if (chart != null) { chart.draw((Graphics2D) g, getBounds()); } } public void destroy() { }}