在图表统计功能中,利用开源项目JFreeChart在开发Web项目方面的简单易用的优势来实现的。下面是对JFreeChart的概念和实现机制的分析。最后给出一个图表统计应用实例。
1、JFreeChart的概念
JFreeChart是一个免费的Java Chart Library,并且它能够被用在应用程序,Applets,Servlets和Jsp中。它是完全源代码公开的,但是如果用到商业中会受到这个许可证书的限制。它是一个开源的图形报表引擎中间件,主要用来各种各样的图表,这些图表包括:饼图、柱状图(普通柱状图以及堆栈柱状图)、线图、区域图、分布图、混合图、甘特图以及一些仪表盘等等。
JFreeChart的开发环境,因为是基于WEB浏览器的图表展现,因此需要一个Servlet引擎或者是J2EE应用服务器(例如WebSphere,Tomcat等)。以及WEB环境的搭建。在开发时必须的两个文件包是:JFreeChart以及Jcommon。目前最新配套版本是:JFreeChart 0.9.20 Jcommon 0.9.4。
2、用JFreeChart创建WEB图表的基本知识和实现机制
(1) JFreeChart主要是由三个类构成:
org.jfree.chart.servlet.ChartDeleter //删除临时目录中的图像
org.jfree.chart.servlet.DisplayChart //显示图像
org.jfree.chart.servlet.ServletUtilities//处理图像
下面是对以上各个类的详细说明:
ChartDeleter 继承自HttpSessionBindingListener,用于实现当Session 关闭时,删除临时目录中的图像文件。
ServletUtilities有一系列方法:
saveChartAs*;saveChartAs*是把图表按照不同的形式存储为图像;
sendTempFile方法被重载了很多次,用于把文件流发送response;
DisplayChart继承自Httpservlet 用于处理显示图像;
(2)在你的应用中 web.xml文件必须配置DisplayChart;
配置形式如:
DisplayChart
org.jfree.chart.servlet.DisplayChart
DisplayChart
/servlet/DisplayChart
3、创建交互式WEB图表的实现机制
很多情况不仅仅要求可以在浏览器上显示一个图表,更需要用户可以直接在图表上做一下交互的操作,例如获取信息提示,点击图表某个部分进行更详细信息的展示等等。为此就要求该图形具有交互操作的功能。在HTML中需要一个图像具有可交互的功能就必须给该图像定义一个Map对象。要根据一个图像来生成对应的MAP对象,则需要在创建一个图表的时候有两个参数,这两个参数就是ChartFactory.createBarChart3D方法中的最后两个参数,这两个参数的类型都是布尔值。它们意思分别是:是否创建工具提示(tooltip)以及是否生成URL。分别对应着MAP中一个AREA的title属性以及href属性。
在JFreeChart中要实现MAP对象的功能,就需要生成一个MAP对象。但是它需要引入另外一个对象:ChartRenderingInfo。但是在JFreeChart没有直接的方法来利用一个图表对象直接生成MAP数据,它需要一个中间对象来过渡,这个对象就是ChartRenderingInfo。
生成MAP数据的流程图如图1.1所示:
图1. 1 MAP数据的流程图
如上图所示,ChartUtilities类是整个流程的核心,它周围的对象都是一些例如数据对象或者是文件等。这个流程简单描述如下:
首先创建一个ChartRenderingInfo对象并在调用ChartUtilities的writeChartAsJPEG时作为最后一个参数传递进去。调用该方法结束后将产生一个图像文件以及一个填充好MAP数据的ChartRenderingInfo对象,有了这个对象还是没有办法获取具体的MAP数据,我们还必须借助于ChartUtilities的writeImageMap方法来将ChartRenderingInfo对象读取出来。
获取MAP数据的代码片断如下:
FileOutputStream fos_jpg = null;//定义一个文件输出流的对象fos_jpg
FileOutputStream fos_cri = null; //定义一个文件输出流的对象fos_cri
try{
//根据不同类型的图表使用不同的类,下面是对饼形图的操作
PiePlot plot = (PiePlot) chart.getPlot();//定义一个饼形图
plot.setURLGenerator(new StandardPieURLGenerator(url));
//设置URL属性
plot.setToolTipGenerator(new StandardPieToolTipGenerator());
//设置工具提示
fos_jpg = new FileOutputStream(“d://example.jpg”);
//实例化一个fos_jpg输出文件流的对象d://example.jpg
ChartUtilities.writeChartAsJPEG(fos_jpg,100,chart,400,300,info);
//保存fos_jpg文件
fos_cri = new FileOutputStream(“d:// example.map”);
//实例化一个fos_cri输出文件流的对象d://example.jpg
PrintWriter w = new PrintWriter(fos_cri);
//输出实例化的文件流对象
ChartUtilities.writeImageMap(w, mapname, info);
// 将图像的MAP写入PrintWriter对象w中
w.flush();
}