现在的位置: 首页 > 综合 > 正文

JFreeChart 详解

2013年10月13日 ⁄ 综合 ⁄ 共 13555字 ⁄ 字号 评论关闭

JFreeChart 可用于生成各式各样的统计图表,只要开发人员提供符合 JFreeChart 所需格式的数据,JFreeChart 即可自动生成相应的统计图表,这些统计图表既可以直接输出成图片文件,也可被导出成 PDF 文档。

JFreeChart 的安装和使用

为了使用 JFreeChart 来生成统计图表,必须下载和安装 JFreeChart 项目。下载和安装 JfreeChart 的步骤比较简单:登录 http://www.jfree.org/jfreechart/download.html 即可下载 JFreeChart 的最新版,然后将 JFreeChart 所需的核心 JAR 包、第三方 JAR(位于 lib 路径下)复制到应用的
CLASSPATH 路径下即可;如果是 Web 应用则需要使用 JFreeChart 图表,将这些 JAR 文件复制到 Web 应用的 WEB-INF/lib 路径下。如果编译和运行中需要使用 JFreeChart 项目,则还应将 lib 路径下的 jfreechart-1.0.13.jar 文件添加到系统的 CLASSPATH 环境变量里;如果使用 Ant,或其他 IDE 工具,则无需添加环境变量。

JFreeChart 是一个非常优秀的图表工具,而且简单、易用,我们只需提供满足 JFreeChart 要求的数据,即可使用 ChartFactory 创建一个 JFreeChart 图表,该图表既可以输出成图片文件,也可以导出成各种格式的文档。

现在将以生成一张饼图为例,示范如何使用 JFreeChart 生成统计图。下面是生成饼状图的 Java 代码:


清单 1. PieChartDemo.java

				 
 public class PieChartDemo 
 { 
	 public static void main(String[] args) throws IOException 
	 { 
		 // 生成普通饼图
		 JFreeChart chart = ChartFactory.createPieChart( 
			"图书销量统计图",  // 图表标题
			 getDataSet(), // 数据
			 true, // 是否显示图例
			 false, // 是否显示工具提示
			 false // 是否生成 URL 
		 ); 
		 // 重新设置图表标题,改变字体
		 chart.setTitle(new TextTitle("图书销量统计图"
			 , new Font("黑体", Font.ITALIC , 22))); 
		 // 取得统计图表的第一个图例
		 LegendTitle legend = chart.getLegend(0); 
		 // 修改图例的字体
		 legend.setItemFont(new Font("宋体", Font.BOLD, 14)); 
		 // 获得饼图的 Plot 对象
		 PiePlot plot = (PiePlot)chart.getPlot(); 
		 // 设置饼图各部分的标签字体
		 plot.setLabelFont(new Font("隶书", Font.BOLD, 18)); 
		 // 设定背景透明度(0-1.0 之间)
		 plot.setBackgroundAlpha(0.9f); 
		 FileOutputStream fos = new FileOutputStream("book.jpg"); 
		 ChartUtilities.writeChartAsJPEG( 
			 fos, // 输出到哪个输出流
			 1, //JPEG 图片的质量,0~1 之间
			 chart, // 统计图表对象
			 800, // 宽
			 600,// 宽
			 null //ChartRenderingInfo 信息
		 ); 
		 fos.close(); 
	 } 
	 private static DefaultPieDataset getDataSet() 
	 { 
		 // 提供生成饼图的数据
		 DefaultPieDataset dataset = new DefaultPieDataset(); 
		 dataset.setValue("疯狂 Java 讲义",47000); 
		 dataset.setValue("轻量级 Java EE 企业实战",38000); 
		 dataset.setValue("疯狂 Ajax 讲义",31000); 
		 dataset.setValue("Struts 2 权威指南",29000); 
		 dataset.setValue("疯狂 XML 讲义",25000); 
		 return dataset; 
	 } 
 } 


上面代码先提供一个方法,该方法返回 Dataset 对象,这个 Dataset 就是创建统计图表的底层数据,然后调用 ChartFactory 的 createPieChart 方法来生成一个 JFreeChart 对象,这个对象就是统计图表,该图表可以直接输出到图片文件中,也可导出成各种格式的文件。

上面示例是导出了一个 JPG 格式的图片文件,编译、运行上面程序,将生成一个 book.jpg 文件,使用 ACDSee 浏览该图片,将看到如图 1 所示的饼图。


图 1. 使用 JFreeChart 生成的饼图
图 1. 使用 JFreeChart 生成的饼图 

从图 1 中可以看出,JFreeChart 统计图可以分成 3 个部分:

  • 图表标题部分。
  • 实际统计图部分。
  • 图表图例部分。

结合上面代码部分可以看出,修改统计图表的标题部分(包括修改图表标题内容、字体大小等)都是通过 JFreeChart 对象的 setTitle 方法实现的,修改统计图表的图例则通过 LegendTitle 对象来完成。一个统计图可以包含多个图例,当调用 JFreeChart 对象的 getLegend(int index)方法时,就可以取得该图表的指定索引的图例对象,一旦取得了指定图例,就可以修改图例的文本内容、字体大小等。

在上面程序中,我们调用了 ChartFactory 的 createPieChart 方法,该方法用于创建一个平面的饼图;如果将该方法修改为 createPieChart3D,则用于创建一个 3D 饼图,创建 3D 饼图时,我们将前景色修改为 0.5 的透明度,将看到生成如图 2 所示的 3D 饼图。


图 2. 使用 JFreeChart 生成的 3D 饼图
图 2. 使用 JFreeChart 生成的 3D 饼图 

JFreeChart 开发步骤

通过上面的开发过程,我们不难发现通过 JFreeChart 开发统计图表是非常简单的,按如下步骤即可非常方便地开发出各种统计图表。

(1)提供一个 Dateset 实例,该实例里包含了创建统计图表的数据。

JFreeChart 使用 DataSet 来封装统计数据,程序首先应将需要显示的统计数据转换为 DataSet。不同的统计图表所使用的 Dataset 实例不一样,例如,饼图使用 PieDataset 实例作为饼图数据;而柱状图则采用 CategoryDataset 作为柱状图数据。

(2)使用 ChartFactory 的多个工厂方法 createXxxChart 来创建统计图表,统计图表就是一个 JFreeChart 对象。

(3)得到了 JFreeChart 对象后,可以调用 setTitle 来修改统计图表的标题;或者调用 getLegend 方法来获得指定索引的图表图例,取得图例对象后即可修改图表的图例。

(4)通过 JFreeChart 对象的 getPlot 方法,即可获得图表的 Plot 对象,该对象对应于统计图表的实际图表部分,可以调用 Plot 对象的方法来修改图表中的各种显示内容。

按上面的 4 个步骤进行,即可快速开发出各种简单的 JFreeChart 图表。

在上面步骤中,共涉及到 JFreeChart 的如下核心 API:

  • XxxDataset:这是一个数据集对象,封装系统中需要显示的统计数据,用于提供显示图表所用的数据。对于不同类型的统计图表,也需要使用不同的 Dataset 对象。
  • ChartFactory:该对象是一个图表工厂类,通过调用该工厂类的不同方法,即可生成不同的统计图表。
  • JFreeChart:代表内存中的统计图表对象,JFreeChart 由如下 3 个部分组成:TextTitle(标题)、LegendTitle(图例标题)和 XxxPlot(实际统计图)。这个统计图表既可输出成图片文件,也可转换成内存中图片,直接在 Java 程序中显示出来。
  • ChartUtilities:该类包含了系列输出统计图表的工具方法,包括输出各种格式的(如 JPG 和 PNG 等)的图表,包括直接输出到文件和普通输出流等。除此之外,该类还包含了创建 HTML 热点的方法(具体参看后面内容)。
  • XxxPlot:实际统计图表对象,这个对象决定了实际图表的显示样式,创建该对象时需要 Axis、Renderer 及数据集对象的支持。

实际统计图表是根据 XxxPlot 对象生成的,为了生成 XxxPlot 对象,还需要额外的 Axis、Renderer 的支持;除此之外,如果希望在网页上生成带交互功能的热点图,还需要用到 XxxURLGenerator 和 XxxToolTipGenerator 等 API。即 JFreeChart 还包含如下常用的核心 API:

  • XxxAxis:用于处理图表的两个轴:纵轴和横轴。
  • XxxRenderer:负责如何显示一个图表对象。
  • XxxURLGenerator:用于生成 Web 图表中每个项目的超级链接。
  • XxxToolTipGenerator:用于生成图表的帮助提示,不同类型图表对应不同类型的工具提示类。

为 Struts 2 应用安装 JFreeChart 插件

为了在 Struts 2 中使用 JFreeChart 统计图表,Struts 2 提供了 JFreeChart 插件支持。借助于 JFreeChart 插件的支持,Struts 2 可以非常方便地使用 JFreeChart 统计图表。

借助于 JFreeChart 插件的支持,Struts 2 允许我们只需在 Action 中返回一个 JFreeChart 实例,而无需处理导出 JFreeChart 实例,在页面显示统计图表等细节。只要我们为 Action 指定一个类型为 chart 的 Result,该 Result 将自动生成一个 JFreeChart 图表来显示 Action 的处理结果。

与 Struts 2 的其他插件类似,安装 JFreeChart 插件非常容易,只需将 Struts 2 的 JFreeChart 插件复制到 Web 应用的 WEB-INF/lib 路径下即可。

查看 struts2-jfreechart-plugin-2.1.6.jar 文件中的 struts-plugin.xml 文件时,发现该配置文件中代码如下:

 <?xml version="1.0" encoding="UTF-8" ?> 
 <!-- 指定 Struts 2 配置文件的 DTD 信息 --> 
 <!DOCTYPE struts PUBLIC 
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd"> 
 <struts> 
 <!-- 让 jfreechart-default 包是由 struts-default 包扩展而来 --> 
 <package name="jfreechart-default" extends="struts-default"> 
 <!-- 包里面的定义没有任何改变 --> 
 ... 
 </package> 
 </struts> 


此处的 jfreechart-default 包已经继承了 struts-default,因此让我们配置 Action 所在包继承 jfreechart-default 即可。

除了要将上面的 struts2-jfreechart-plugin-2.1.6.jar 文件复制到 Web 应用的 WEB-INF/lib 路径下之外,当然还需要将 JFreeChart 的二进制类库文件复制到 Web 应用的 WEB-INF/lib 路径下。经过上面步骤,即完成了 Struts 2 和 JFreeChart 的整合。

在 Struts 2 应用中使用 JFreeChart

Struts 2.1 的改进
JFreeChart 插件要求用户的 Action 中 JFreeChart 类型的属性名只能是 chart(必须提供 getChart() 方法,且该方法返回 JFreeChart 对象),这种硬编码方式提供的统计图表大大降低了 Action 的灵活性。Struts 2.1 改进了这个地方,开发者允许使用任何方法返回一个 JFreeChart 对象。假如开发者提供了 getAbc() 方法返回一个 JFreeChart 对象,那需要开发者配置 Action 时配置一个名为 value 的参数。也就是增加如下配置:

将 JFreeChart 与 Struts 2 整合后,可以对 JFreeChart 统计图表的开发有一定的简化作用。下面就以一个简单的饼状图为例,介绍如何在 Struts 2 中使用 JFreeChart 统计图表。

创建 Action 类

如果仅仅使用 Struts 2 官方提供的 JFreeChart 插件,那么 Struts 2 的 JFreeChart 插件对开发 JFreeChart 并没有提供太多的简便,我们依然需要手动创建 JFreeChart 实例。如果需要的 Action 中的统计图表能被 Struts 2 处理,则要求该 JFreeChart 类型的属性名为 chart ——也就是要求该 Action
内必须有一个 getChart() 方法,该方法返回一个 JFreeChart 对象。

下面是该 Action 的实现类代码:


清单 2. ChartAction.java

				 
 public class ChartAction extends ActionSupport 
 { 
	 private JFreeChart chart; 
	 // 必须提供 getChart() 方法,且由该方法返回 JFreeChart 对象
	 public JFreeChart getChart() 
	 { 
		 chart = ChartFactory.createPieChart3D( 
			"图书销量统计图",  // 图表标题
			 getDataSet(), // 数据
			 true, // 是否显示图例
			 false, // 是否显示工具提示
			 false // 是否生成 URL 
		 ); 
		 // 重新设置图表标题,改变字体
		 chart.setTitle(new TextTitle("图书销量统计图"
			 , new Font("黑体", Font.ITALIC , 22))); 
		 // 取得统计图表的第一个图例
		 LegendTitle legend = chart.getLegend(0); 
		 // 修改图例的字体
		 legend.setItemFont(new Font("宋体", Font.BOLD, 14)); 
		 // 获得饼图的 Plot 对象
		 PiePlot plot = (PiePlot)chart.getPlot(); 
		 // 设置饼图各部分的标签字体
		 plot.setLabelFont(new Font("隶书", Font.BOLD, 18)); 
		 // 设定背景透明度(0-1.0 之间)
        	 plot.setBackgroundAlpha(0.9f); 
		 // 设定前景透明度(0-1.0 之间)
       	 plot.setForegroundAlpha(0.50f); 
		 return chart; 
	 } 
	 // 获取生成统计图的 Dataset 
	 private DefaultPieDataset getDataSet() 
	 { 
		 DefaultPieDataset dataset = new DefaultPieDataset(); 
		 dataset.setValue("疯狂 Java 讲义",47000); 
		 dataset.setValue("轻量级 Java EE 企业实战",38000); 
		 dataset.setValue("疯狂 Ajax 讲义",31000); 
		 dataset.setValue("Struts 2 权威指南",29000); 
		 dataset.setValue("疯狂 XML 讲义",25000); 
		 return dataset; 
	 } 
 } 


上面 Action 类继承了 ActionSupport 类,因此无需提供 execute 方法——这是因为 ActionSupport 类已经提供了一个 execute() 方法,该方法返回一个 success 字符串作为逻辑视图,该 Action 直接使用 ActionSupport 的 execute 方法作为系统的处理逻辑。

从上面代码中不难发现,上面的 Action 有如下两个非常不灵活的地方:

  • 需要手动创建 JFreeChart 实例,与创建普通 JFreeChart 图表没有太大的区别。
  • Action 的统计图表属性名必须是 chart(必须提供 getChart() 方法,且该方法返回 JFreeChart 对象),这种硬编码方式提供的属性大大降低了 Action 的灵活性。

配置 Action

配置 JFreeChart 的 Action 非常简单,只需要为该 Action 指定一个类型为 chart 的 Result,该 Result 将使用 JFreeChart 统计图表来作为视图组件。配置类型为 chart 的 Result 时,可以指定两个参数:width 和 height,这两个参数分别指定统计图的宽和高。

因为前面已经定义了名为 jfreechart-default 的包,该包扩展了 Struts 2 系统的 struts-default 包,在 struts-default 包里增加了一个名为 chart 的 Result 类型。因此我们应该让 Struts 2 应用中自定义包继承 jfreechart-default 包即可。

下面是本示例应用的 struts-config.xml 文件:


清单 3. struts-config.xml

				 
 <?xml version="1.0" encoding="GBK"?> 
 <!-- 指定 Struts 2 配置文件的 DTD 信息 --> 
 <!DOCTYPE struts PUBLIC 
	"-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
	"http://struts.apache.org/dtds/struts-2.1.dtd"> 
 <struts> 
	 <!-- 配置 Struts 2 应用中的常量 --> 
	 <constant name="struts.custom.i18n.resources" 
		 value="messageResource"/> 
	 <constant name="struts.i18n.encoding" value="GBK"/> 
	 <!-- 配置本应用中的包,继承 jfreechart-default 包 --> 
	 <package name="lee" extends="jfreechart-default"> 
		 <!-- 定义一个名为 bookChart 的 Action --> 
		 <action name="bookChart" class="lee.ChartAction"> 
			 <result type="chart"> 
				 <!-- 定义 JFreeChart 报表的大小 --> 
				 <param name="width">800</param> 
				 <param name="height">600</param> 
			 </result> 
		 </action> 
	 </package> 
 </struts> 


上面配置文件配置了一个名为 bookChart 的 Action,该 Action 将产生一个类型为 chart 的 Result。在浏览器中直接向 bookChart.action 发送请求,将看到如图 3 所示的统计图。


图 3. 整合 Struts 2 和 JFreeChart 生成统计图
图 3. 整合 Struts 2 和 JFreeChart 生成统计图 

从上面的程序中不难看出,Struts 2 的 JFreeChart 插件所完成的事情就是负责将 Action 里的 JFreeChart 实例提取出来,并输出到 HttpServletResponse 中。

分析 Struts 2 官方提供的 JFreeChart 插件不难发现,它的主要作用就是在页面中显示 Action 中的 JFreeChart 对象。因此 JFreeChart 插件所完成的工作非常有限,即使我们在 Struts 2 中整合了 JFreeChart 框架,我们依然需要自己手动创建 JFreeChart 实例,这是非常烦琐的事情。最理想的状况是我们只提供需要显示的数据,而
Struts 2 对 JFreeChart 进行封装,自动生成 JFreeChart 图表,并将其显示在 HTML 页面上。

下面我们将来介绍改进后的 JFreeChart 插件

改进 JFreeChart 插件

前面提到 Struts 2 的 JFreeChart 插件存在一些不够方便的地方,主要是 Struts 2 的 Action 还必须手动创建 JFreeChart 对象,这就显得比较繁琐了。

对于常见的饼图、柱状图,我们可以对 JFreeChart 插件进行适当改进,由 JFreeChart 插件来根据 Dataset 创建 JFreeChart 对象,这样就可以让 Struts 2 Action 开发者更加简便。

JFreeChart 插件的关键就是实现了一个名为“chart”的 Result Type,为了简化 JFreeChart 插件,我们改进这个名为“chart”的 Result Type,下面是改进过的 Result Type 类:


清单 4. CrazyChartResult.java

				 
 package org.crazyit.struts2.dispatcher; 
 import org.apache.struts2.ServletActionContext; 
 import com.opensymphony.xwork2.ActionInvocation; 
 import com.opensymphony.xwork2.Result; 
 import org.jfree.chart.ChartUtilities; 
 import org.jfree.chart.JFreeChart; 
 import org.jfree.chart.ChartFactory; 
 import org.jfree.data.general.*; 
 import org.jfree.data.category.CategoryDataset; 
 import org.jfree.chart.plot.PlotOrientation; 
 import org.apache.struts2.dispatcher.ChartResult; 

 import java.io.OutputStream; 

 public class CrazyChartResult extends ChartResult 
 { 
	 private boolean chartSet; 
	 private Dataset dataset; 
	 private String chartType; 
	 private String title; 
	 public CrazyChartResult() 
	 { 
		 super(); 
	 } 
	 // 省略了各属性的 setter 和 getter 方法
	 ... 
	 public void execute(ActionInvocation invocation) throws Exception 
	 { 
		 // 获取 dataset 
		 if (!chartSet) 
		 { 
			 System.out.println("!!!!!!!!!!!"); 
			 dataset = (Dataset) invocation.getStack() 
				 .findValue("dataset", Dataset.class); 
		 } 
		 // 如果 JFreeChart 不存在,Dataset 也不存在,那将引发异常
		 if (super.getChart() == null 
			 && dataset == null) 
			 throw new NullPointerException( 
				"No JFreeChart object found on the stack with name "
		 + super.getValue() 	 + "且创建统计图表的 Dataset 也不存在!"); 
		 if (super.getChart() == null 
			 && dataset != null) 
		 { 
			 if (chartType.equals("pieChart")) 
			 { 
				 // 创建统计图
				 super.setChart(ChartFactory.createPieChart( 
					 title,  // 图表标题
					 (PieDataset)dataset, // 数据
					 true, // 是否显示图例
					 false, // 是否显示工具提示
					 false // 是否生成 URL 
				 )); 
			 } 
			 else if (chartType.equals("barChart")) 
			 { 
				 super.setChart(ChartFactory.createBarChart( 
					 title, 
					"横座标", 
					"纵坐标", 
					 (CategoryDataset)dataset, 
					 PlotOrientation.HORIZONTAL, 
					 true, // 是否显示图例
					 false, // 是否显示工具提示
					 false // 是否生成 URL 
				 )); 
			 } 
			 else 
			 { 
				 throw new IllegalArgumentException( 
					"该插件暂不支持" + chartType + "类型的统计图 ."); 
			 } 
		 } 
		 // 保证统计图表的高、宽数据存在。
		 if (super.getHeight() == null) 
		  throw new NullPointerException("No height parameter was given."); 
		 if (super.getWidth() == null) 
		  throw new NullPointerException("No width parameter was given."); 
		 // 获取输出图片的二进制输出流
		 OutputStream os = ServletActionContext 
			 .getResponse().getOutputStream(); 
		 try 
		 { 
			 // 输出统计图
			 if ("png".equalsIgnoreCase(super.getType())) 
				 ChartUtilities.writeChartAsPNG(os, super.getChart() 
				 , super.getWidth(), super.getHeight()); 
			 else if ("jpg".equalsIgnoreCase(super.getType()) 
				 || "jpeg".equalsIgnoreCase(super.getType())) 
			 ChartUtilities.writeChartAsJPEG(os, super.getChart() 
				 , super.getWidth(), super.getHeight()); 
			 else 
			 throw new IllegalArgumentException(super.getType() 
      + " is not a supported render type (only JPG and PNG are)."); 
		 } 
		 finally 
		 { 
			 if (os != null) os.flush(); 
		 } 
	 } 
 }


上面程序中粗体字代码就负责根据 Action 中 Dataset 来创建 JFreeChart 对象,从上面源代码中可以看出,这个 JFreeChart 插件只支持创建饼图和柱状图两种;如果开发者希望使用其他其他统计图,则依然需要手动创建 JFreeChart 对象。

提供了上面 CrazyChartResult 类之后,接下来为新的 Struts 2 插件提供 struts-plugin.xml 文件,这个文件的配置非常简单,只要将名为 chart 的 Result Type 改为使用 CrazyChartResult 类即可。下面是扩展后的 JFreeChart 插件中配置文件的代码:

 <?xml version="1.0" encoding="UTF-8" ?> 
 <!DOCTYPE struts PUBLIC 
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd"> 
 <struts> 
    <package name="jfreechart-default" extends="struts-default">    
    <result-types> 
    <result-type name="chart"
 class="org.crazyit.struts2.dispatcher.CrazyChartResult"> 
    <param name="height">150</param> 
    <param name="width">200</param> 
    </result-type> 
    </result-types> 
    </package> 
 </struts> 


从上面粗体字代码可以看出,此时的 JFreeChart 插件中名为“chart”的 Result Type 已经改为使用 CrazyChartResult 了,这就允许 Struts 2 中 Action 只要提供 Dataset 即可。

将这些资源打包成 JAR 文件,即可放在项目中正常使用了。扩展后的 JFreeChart 插件可下载本文的 struts2-crazytjfreechart-plugin-2.1.6.jar 附件。

使用改进后 JFreeChart 插件

提供了改进后的 JFreeChart 插件之后,接下来开发者开发的 Action 就会简单多了,下面的 Action 只有一个 getDataset() 方法,该方法返回创建 JFreeChart 的 Dataset 对象,不再需要手动创建 JFreeChart 对象——这个工作由扩展后的 JFreeChart 插件完成。

还是前面那个创建饼图的示例程序,但此时的 Action 就简单多了,下面是该 Action 类的代码:


清单 5. ChartAction.java

				 
 public class ChartAction extends ActionSupport 
 { 
	 // 获取生成统计图的 Dataset 
	 public DefaultPieDataset getDataset() 
	 { 
		 DefaultPieDataset dataset = new DefaultPieDataset(); 
		 dataset.setValue("Java",47000); 
		 dataset.setValue("Java EE",38000); 
		 dataset.setValue("Ajax",31000); 
		 dataset.setValue("Struts 2",29000); 
		 dataset.setValue("XML",25000); 
		 return dataset; 
	 } 
 } 


上面的 Action 类已经简化多了,该 Action 只需提供一个 Dataset 即可,剩下的事情都交给 JFreeChart 插件来完成。

当然,开发者还应该告诉 JFreeChart 需要创建怎样的统计图、统计图的标题等必要信息,因此配置该 Action 时需要更多的参数,下面是该 Action 的配置代码:


清单 6. struts.xml

				 
 <?xml version="1.0" encoding="GBK"?> 
 <!-- 指定 Struts 2 配置文件的 DTD 信息 --> 
 <!DOCTYPE struts PUBLIC 
	"-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
	"http://struts.apache.org/dtds/struts-2.1.dtd"> 
 <struts> 
	 <!-- 配置 Struts 2 应用中的常量 --> 
	 <constant name="struts.custom.i18n.resources" 
		 value="messageResource"/> 
	 <constant name="struts.i18n.encoding" value="GBK"/> 
	 <!-- 配置本应用中的包,继承 jfreechart-default 包 --> 
	 <package name="lee" extends="jfreechart-default"> 
		 <!-- 定义一个名为 bookChart 的 Action --> 
		 <action name="bookChart" class="lee.ChartAction"> 
			 <result type="chart"> 
				 <!-- 定义 JFreeChart 报表的大小 --> 
				 <param name="width">800</param> 
				 <param name="height">600</param> 
				 <!-- 指定统计图的标题 --> 
				 <param name="title">Test Title</param> 
				 <!-- 指定创建一个饼图 --> 
				 <param name="chartType">pieChart</param>
			 </result> 
		 </action> 
	 </package> 
 </struts> 


上面配置文件中粗体字代码指定了创建统计图的类型(饼图)、统计图的标题,提供了这些必要信息之后,JFreeChart 插件即可根据 Action 提供的 Dataset、配置文件中提供的统计图标题、统计图类型自动生成统计图。在浏览器中直接向 bookChart.action 发送请求,将看到如图 3 所示的统计图。


图 4. 使用改进后的 JFreeChart 插件
图 4. 使用改进后的 JFreeChart 插件 

从图 4 可以看出,改进后的 JFreeChart 插件可以根据 Action 提供的 Dataset 来生成统计图,但需要指出的是:采用这种方式生成的统计图显然无法设置太多的自定义属性——这是因为 JFreeChart 插件负责根据 Dataset 来创建 JFreeChart,而 JFreeChart 插件显然没法根据具体项目进行定制。

由此可见,改进后的 JFreeChart 插件用起来更方便;如果开发者需要获得对 JFreeChart 全部的控制,则依然可以在 Action 中手动创建 JFreeChart,从而弥补灵活性不足的缺点。

小结

JFreeChart 是一个非常优秀的统计图表工具,对于实际企业开发具有非常重要的作用。Struts 2 作为一个强大前端 MVC 框架,已经提供了对 JFreeChart 的封装,不过这种封装对于实际开发来说显得还不够简洁。本文主要从简洁、易用的角度对 Struts 2 的 JFreeChart 做了进一步改进,使得实际项目中可以更方便使用 JFreeChart 来生成统计图表。

抱歉!评论已关闭.