|
JFreeChart 可用于生成各式各樣的統(tǒng)計圖表,只要開發(fā)人員提供符合 JFreeChart 所需格式的數(shù)據(jù),JFreeChart 即可自動生成相應(yīng)的統(tǒng)計圖表,這些統(tǒng)計圖表既可以直接輸出成圖片文件,也可被導(dǎo)出成 PDF 文檔。
JFreeChart 的安裝和使用
為了使用 JFreeChart 來生成統(tǒng)計圖表,必須下載和安裝 JFreeChart 項目。下載和安裝 JfreeChart 的步驟比較簡單:登錄 http://www./jfreechart/download.html 即可下載 JFreeChart 的最新版,然后將 JFreeChart 所需的核心 JAR 包、第三方 JAR(位于 lib 路徑下)復(fù)制到應(yīng)用的 CLASSPATH 路徑下即可;如果是 Web 應(yīng)用則需要使用 JFreeChart 圖表,將這些 JAR 文件復(fù)制到 Web 應(yīng)用的 WEB-INF/lib 路徑下。如果編譯和運行中需要使用 JFreeChart 項目,則還應(yīng)將 lib 路徑下的 jfreechart-1.0.13.jar 文件添加到系統(tǒng)的 CLASSPATH 環(huán)境變量里;如果使用 Ant,或其他 IDE 工具,則無需添加環(huán)境變量。
JFreeChart 是一個非常優(yōu)秀的圖表工具,而且簡單、易用,我們只需提供滿足 JFreeChart 要求的數(shù)據(jù),即可使用 ChartFactory 創(chuàng)建一個 JFreeChart 圖表,該圖表既可以輸出成圖片文件,也可以導(dǎo)出成各種格式的文檔。
現(xiàn)在將以生成一張餅圖為例,示范如何使用 JFreeChart 生成統(tǒng)計圖。下面是生成餅狀圖的 Java 代碼:
清單 1. PieChartDemo.java
public class PieChartDemo
{
public static void main(String[] args) throws IOException
{
// 生成普通餅圖
JFreeChart chart = ChartFactory.createPieChart(
"圖書銷量統(tǒng)計圖", // 圖表標(biāo)題
getDataSet(), // 數(shù)據(jù)
true, // 是否顯示圖例
false, // 是否顯示工具提示
false // 是否生成 URL
);
// 重新設(shè)置圖表標(biāo)題,改變字體
chart.setTitle(new TextTitle("圖書銷量統(tǒng)計圖"
, new Font("黑體", Font.ITALIC , 22)));
// 取得統(tǒng)計圖表的第一個圖例
LegendTitle legend = chart.getLegend(0);
// 修改圖例的字體
legend.setItemFont(new Font("宋體", Font.BOLD, 14));
// 獲得餅圖的 Plot 對象
PiePlot plot = (PiePlot)chart.getPlot();
// 設(shè)置餅圖各部分的標(biāo)簽字體
plot.setLabelFont(new Font("隸書", Font.BOLD, 18));
// 設(shè)定背景透明度(0-1.0 之間)
plot.setBackgroundAlpha(0.9f);
FileOutputStream fos = new FileOutputStream("book.jpg");
ChartUtilities.writeChartAsJPEG(
fos, // 輸出到哪個輸出流
1, //JPEG 圖片的質(zhì)量,0~1 之間
chart, // 統(tǒng)計圖表對象
800, // 寬
600,// 寬
null //ChartRenderingInfo 信息
);
fos.close();
}
private static DefaultPieDataset getDataSet()
{
// 提供生成餅圖的數(shù)據(jù)
DefaultPieDataset dataset = new DefaultPieDataset();
dataset.setValue("瘋狂 Java 講義",47000);
dataset.setValue("輕量級 Java EE 企業(yè)實戰(zhàn)",38000);
dataset.setValue("瘋狂 Ajax 講義",31000);
dataset.setValue("Struts 2 權(quán)威指南",29000);
dataset.setValue("瘋狂 XML 講義",25000);
return dataset;
}
}
|
上面代碼先提供一個方法,該方法返回 Dataset 對象,這個 Dataset 就是創(chuàng)建統(tǒng)計圖表的底層數(shù)據(jù),然后調(diào)用 ChartFactory 的 createPieChart 方法來生成一個 JFreeChart 對象,這個對象就是統(tǒng)計圖表,該圖表可以直接輸出到圖片文件中,也可導(dǎo)出成各種格式的文件。
上面示例是導(dǎo)出了一個 JPG 格式的圖片文件,編譯、運行上面程序,將生成一個 book.jpg 文件,使用 ACDSee 瀏覽該圖片,將看到如圖 1 所示的餅圖。
圖 1. 使用 JFreeChart 生成的餅圖
從圖 1 中可以看出,JFreeChart 統(tǒng)計圖可以分成 3 個部分:
-
圖表標(biāo)題部分。
-
實際統(tǒng)計圖部分。
-
圖表圖例部分。
結(jié)合上面代碼部分可以看出,修改統(tǒng)計圖表的標(biāo)題部分(包括修改圖表標(biāo)題內(nèi)容、字體大小等)都是通過 JFreeChart 對象的 setTitle 方法實現(xiàn)的,修改統(tǒng)計圖表的圖例則通過 LegendTitle 對象來完成。一個統(tǒng)計圖可以包含多個圖例,當(dāng)調(diào)用 JFreeChart 對象的 getLegend(int index)方法時,就可以取得該圖表的指定索引的圖例對象,一旦取得了指定圖例,就可以修改圖例的文本內(nèi)容、字體大小等。
在上面程序中,我們調(diào)用了 ChartFactory 的 createPieChart 方法,該方法用于創(chuàng)建一個平面的餅圖;如果將該方法修改為 createPieChart3D,則用于創(chuàng)建一個 3D 餅圖,創(chuàng)建 3D 餅圖時,我們將前景色修改為 0.5 的透明度,將看到生成如圖 2 所示的 3D 餅圖。
圖 2. 使用 JFreeChart 生成的 3D 餅圖
JFreeChart 開發(fā)步驟
通過上面的開發(fā)過程,我們不難發(fā)現(xiàn)通過 JFreeChart 開發(fā)統(tǒng)計圖表是非常簡單的,按如下步驟即可非常方便地開發(fā)出各種統(tǒng)計圖表。
(1)提供一個 Dateset 實例,該實例里包含了創(chuàng)建統(tǒng)計圖表的數(shù)據(jù)。
JFreeChart 使用 DataSet 來封裝統(tǒng)計數(shù)據(jù),程序首先應(yīng)將需要顯示的統(tǒng)計數(shù)據(jù)轉(zhuǎn)換為 DataSet。不同的統(tǒng)計圖表所使用的 Dataset 實例不一樣,例如,餅圖使用 PieDataset 實例作為餅圖數(shù)據(jù);而柱狀圖則采用 CategoryDataset 作為柱狀圖數(shù)據(jù)。
(2)使用 ChartFactory 的多個工廠方法 createXxxChart 來創(chuàng)建統(tǒng)計圖表,統(tǒng)計圖表就是一個 JFreeChart 對象。
(3)得到了 JFreeChart 對象后,可以調(diào)用 setTitle 來修改統(tǒng)計圖表的標(biāo)題;或者調(diào)用 getLegend 方法來獲得指定索引的圖表圖例,取得圖例對象后即可修改圖表的圖例。
(4)通過 JFreeChart 對象的 getPlot 方法,即可獲得圖表的 Plot 對象,該對象對應(yīng)于統(tǒng)計圖表的實際圖表部分,可以調(diào)用 Plot 對象的方法來修改圖表中的各種顯示內(nèi)容。
按上面的 4 個步驟進(jìn)行,即可快速開發(fā)出各種簡單的 JFreeChart 圖表。
在上面步驟中,共涉及到 JFreeChart 的如下核心 API:
-
XxxDataset:這是一個數(shù)據(jù)集對象,封裝系統(tǒng)中需要顯示的統(tǒng)計數(shù)據(jù),用于提供顯示圖表所用的數(shù)據(jù)。對于不同類型的統(tǒng)計圖表,也需要使用不同的 Dataset 對象。
-
ChartFactory:該對象是一個圖表工廠類,通過調(diào)用該工廠類的不同方法,即可生成不同的統(tǒng)計圖表。
-
JFreeChart:代表內(nèi)存中的統(tǒng)計圖表對象,JFreeChart 由如下 3 個部分組成:TextTitle(標(biāo)題)、LegendTitle(圖例標(biāo)題)和 XxxPlot(實際統(tǒng)計圖)。這個統(tǒng)計圖表既可輸出成圖片文件,也可轉(zhuǎn)換成內(nèi)存中圖片,直接在 Java 程序中顯示出來。
-
ChartUtilities:該類包含了系列輸出統(tǒng)計圖表的工具方法,包括輸出各種格式的(如 JPG 和 PNG 等)的圖表,包括直接輸出到文件和普通輸出流等。除此之外,該類還包含了創(chuàng)建 HTML 熱點的方法(具體參看后面內(nèi)容)。
-
XxxPlot:實際統(tǒng)計圖表對象,這個對象決定了實際圖表的顯示樣式,創(chuàng)建該對象時需要 Axis、Renderer 及數(shù)據(jù)集對象的支持。
實際統(tǒng)計圖表是根據(jù) XxxPlot 對象生成的,為了生成 XxxPlot 對象,還需要額外的 Axis、Renderer 的支持;除此之外,如果希望在網(wǎng)頁上生成帶交互功能的熱點圖,還需要用到 XxxURLGenerator 和 XxxToolTipGenerator 等 API。即 JFreeChart 還包含如下常用的核心 API:
-
XxxAxis:用于處理圖表的兩個軸:縱軸和橫軸。
-
XxxRenderer:負(fù)責(zé)如何顯示一個圖表對象。
-
XxxURLGenerator:用于生成 Web 圖表中每個項目的超級鏈接。
-
XxxToolTipGenerator:用于生成圖表的幫助提示,不同類型圖表對應(yīng)不同類型的工具提示類。
為 Struts 2 應(yīng)用安裝 JFreeChart 插件
為了在 Struts 2 中使用 JFreeChart 統(tǒng)計圖表,Struts 2 提供了 JFreeChart 插件支持。借助于 JFreeChart 插件的支持,Struts 2 可以非常方便地使用 JFreeChart 統(tǒng)計圖表。
借助于 JFreeChart 插件的支持,Struts 2 允許我們只需在 Action 中返回一個 JFreeChart 實例,而無需處理導(dǎo)出 JFreeChart 實例,在頁面顯示統(tǒng)計圖表等細(xì)節(jié)。只要我們?yōu)?Action 指定一個類型為 chart 的 Result,該 Result 將自動生成一個 JFreeChart 圖表來顯示 Action 的處理結(jié)果。
與 Struts 2 的其他插件類似,安裝 JFreeChart 插件非常容易,只需將 Struts 2 的 JFreeChart 插件復(fù)制到 Web 應(yīng)用的 WEB-INF/lib 路徑下即可。
查看 struts2-jfreechart-plugin-2.1.6.jar 文件中的 struts-plugin.xml 文件時,發(fā)現(xiàn)該配置文件中代碼如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!-- 指定 Struts 2 配置文件的 DTD 信息 -->
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts./dtds/struts-2.0.dtd">
<struts>
<!-- 讓 jfreechart-default 包是由 struts-default 包擴展而來 -->
<package name="jfreechart-default" extends="struts-default">
<!-- 包里面的定義沒有任何改變 -->
...
</package>
</struts>
|
此處的 jfreechart-default 包已經(jīng)繼承了 struts-default,因此讓我們配置 Action 所在包繼承 jfreechart-default 即可。
除了要將上面的 struts2-jfreechart-plugin-2.1.6.jar 文件復(fù)制到 Web 應(yīng)用的 WEB-INF/lib 路徑下之外,當(dāng)然還需要將 JFreeChart 的二進(jìn)制類庫文件復(fù)制到 Web 應(yīng)用的 WEB-INF/lib 路徑下。經(jīng)過上面步驟,即完成了 Struts 2 和 JFreeChart 的整合。
在 Struts 2 應(yīng)用中使用 JFreeChart
將 JFreeChart 與 Struts 2 整合后,可以對 JFreeChart 統(tǒng)計圖表的開發(fā)有一定的簡化作用。下面就以一個簡單的餅狀圖為例,介紹如何在 Struts 2 中使用 JFreeChart 統(tǒng)計圖表。
創(chuàng)建 Action 類
如果僅僅使用 Struts 2 官方提供的 JFreeChart 插件,那么 Struts 2 的 JFreeChart 插件對開發(fā) JFreeChart 并沒有提供太多的簡便,我們依然需要手動創(chuàng)建 JFreeChart 實例。如果需要的 Action 中的統(tǒng)計圖表能被 Struts 2 處理,則要求該 JFreeChart 類型的屬性名為 chart ——也就是要求該 Action 內(nèi)必須有一個 getChart() 方法,該方法返回一個 JFreeChart 對象。
下面是該 Action 的實現(xiàn)類代碼:
清單 2. ChartAction.java
public class ChartAction extends ActionSupport
{
private JFreeChart chart;
// 必須提供 getChart() 方法,且由該方法返回 JFreeChart 對象
public JFreeChart getChart()
{
chart = ChartFactory.createPieChart3D(
"圖書銷量統(tǒng)計圖", // 圖表標(biāo)題
getDataSet(), // 數(shù)據(jù)
true, // 是否顯示圖例
false, // 是否顯示工具提示
false // 是否生成 URL
);
// 重新設(shè)置圖表標(biāo)題,改變字體
chart.setTitle(new TextTitle("圖書銷量統(tǒng)計圖"
, new Font("黑體", Font.ITALIC , 22)));
// 取得統(tǒng)計圖表的第一個圖例
LegendTitle legend = chart.getLegend(0);
// 修改圖例的字體
legend.setItemFont(new Font("宋體", Font.BOLD, 14));
// 獲得餅圖的 Plot 對象
PiePlot plot = (PiePlot)chart.getPlot();
// 設(shè)置餅圖各部分的標(biāo)簽字體
plot.setLabelFont(new Font("隸書", Font.BOLD, 18));
// 設(shè)定背景透明度(0-1.0 之間)
plot.setBackgroundAlpha(0.9f);
// 設(shè)定前景透明度(0-1.0 之間)
plot.setForegroundAlpha(0.50f);
return chart;
}
// 獲取生成統(tǒng)計圖的 Dataset
private DefaultPieDataset getDataSet()
{
DefaultPieDataset dataset = new DefaultPieDataset();
dataset.setValue("瘋狂 Java 講義",47000);
dataset.setValue("輕量級 Java EE 企業(yè)實戰(zhàn)",38000);
dataset.setValue("瘋狂 Ajax 講義",31000);
dataset.setValue("Struts 2 權(quán)威指南",29000);
dataset.setValue("瘋狂 XML 講義",25000);
return dataset;
}
}
|
上面 Action 類繼承了 ActionSupport 類,因此無需提供 execute 方法——這是因為 ActionSupport 類已經(jīng)提供了一個 execute() 方法,該方法返回一個 success 字符串作為邏輯視圖,該 Action 直接使用 ActionSupport 的 execute 方法作為系統(tǒng)的處理邏輯。
從上面代碼中不難發(fā)現(xiàn),上面的 Action 有如下兩個非常不靈活的地方:
-
需要手動創(chuàng)建 JFreeChart 實例,與創(chuàng)建普通 JFreeChart 圖表沒有太大的區(qū)別。
-
Action 的統(tǒng)計圖表屬性名必須是 chart(必須提供 getChart() 方法,且該方法返回 JFreeChart 對象),這種硬編碼方式提供的屬性大大降低了 Action 的靈活性。
配置 Action
配置 JFreeChart 的 Action 非常簡單,只需要為該 Action 指定一個類型為 chart 的 Result,該 Result 將使用 JFreeChart 統(tǒng)計圖表來作為視圖組件。配置類型為 chart 的 Result 時,可以指定兩個參數(shù):width 和 height,這兩個參數(shù)分別指定統(tǒng)計圖的寬和高。
因為前面已經(jīng)定義了名為 jfreechart-default 的包,該包擴展了 Struts 2 系統(tǒng)的 struts-default 包,在 struts-default 包里增加了一個名為 chart 的 Result 類型。因此我們應(yīng)該讓 Struts 2 應(yīng)用中自定義包繼承 jfreechart-default 包即可。
下面是本示例應(yīng)用的 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./dtds/struts-2.1.dtd">
<struts>
<!-- 配置 Struts 2 應(yīng)用中的常量 -->
<constant name="struts.custom.i18n.resources"
value="messageResource"/>
<constant name="struts.i18n.encoding" value="GBK"/>
<!-- 配置本應(yīng)用中的包,繼承 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 將產(chǎn)生一個類型為 chart 的 Result。在瀏覽器中直接向 bookChart.action 發(fā)送請求,將看到如圖 3 所示的統(tǒng)計圖。
圖 3. 整合 Struts 2 和 JFreeChart 生成統(tǒng)計圖
從上面的程序中不難看出,Struts 2 的 JFreeChart 插件所完成的事情就是負(fù)責(zé)將 Action 里的 JFreeChart 實例提取出來,并輸出到 HttpServletResponse 中。
分析 Struts 2 官方提供的 JFreeChart 插件不難發(fā)現(xiàn),它的主要作用就是在頁面中顯示 Action 中的 JFreeChart 對象。因此 JFreeChart 插件所完成的工作非常有限,即使我們在 Struts 2 中整合了 JFreeChart 框架,我們依然需要自己手動創(chuàng)建 JFreeChart 實例,這是非常煩瑣的事情。最理想的狀況是我們只提供需要顯示的數(shù)據(jù),而 Struts 2 對 JFreeChart 進(jìn)行封裝,自動生成 JFreeChart 圖表,并將其顯示在 HTML 頁面上。
下面我們將來介紹改進(jìn)后的 JFreeChart 插件
改進(jìn) JFreeChart 插件
前面提到 Struts 2 的 JFreeChart 插件存在一些不夠方便的地方,主要是 Struts 2 的 Action 還必須手動創(chuàng)建 JFreeChart 對象,這就顯得比較繁瑣了。
對于常見的餅圖、柱狀圖,我們可以對 JFreeChart 插件進(jìn)行適當(dāng)改進(jìn),由 JFreeChart 插件來根據(jù) Dataset 創(chuàng)建 JFreeChart 對象,這樣就可以讓 Struts 2 Action 開發(fā)者更加簡便。
JFreeChart 插件的關(guān)鍵就是實現(xiàn)了一個名為“chart”的 Result Type,為了簡化 JFreeChart 插件,我們改進(jìn)這個名為“chart”的 Result Type,下面是改進(jìn)過的 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 也不存在,那將引發(fā)異常
if (super.getChart() == null
&& dataset == null)
throw new NullPointerException(
"No JFreeChart object found on the stack with name "
+ super.getValue() + "且創(chuàng)建統(tǒng)計圖表的 Dataset 也不存在!");
if (super.getChart() == null
&& dataset != null)
{
if (chartType.equals("pieChart"))
{
// 創(chuàng)建統(tǒng)計圖
super.setChart(ChartFactory.createPieChart(
title, // 圖表標(biāo)題
(PieDataset)dataset, // 數(shù)據(jù)
true, // 是否顯示圖例
false, // 是否顯示工具提示
false // 是否生成 URL
));
}
else if (chartType.equals("barChart"))
{
super.setChart(ChartFactory.createBarChart(
title,
"橫座標(biāo)",
"縱坐標(biāo)",
(CategoryDataset)dataset,
PlotOrientation.HORIZONTAL,
true, // 是否顯示圖例
false, // 是否顯示工具提示
false // 是否生成 URL
));
}
else
{
throw new IllegalArgumentException(
"該插件暫不支持" + chartType + "類型的統(tǒng)計圖 .");
}
}
// 保證統(tǒng)計圖表的高、寬數(shù)據(jù)存在。
if (super.getHeight() == null)
throw new NullPointerException("No height parameter was given.");
if (super.getWidth() == null)
throw new NullPointerException("No width parameter was given.");
// 獲取輸出圖片的二進(jìn)制輸出流
OutputStream os = ServletActionContext
.getResponse().getOutputStream();
try
{
// 輸出統(tǒng)計圖
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();
}
}
}
|
上面程序中粗體字代碼就負(fù)責(zé)根據(jù) Action 中 Dataset 來創(chuàng)建 JFreeChart 對象,從上面源代碼中可以看出,這個 JFreeChart 插件只支持創(chuàng)建餅圖和柱狀圖兩種;如果開發(fā)者希望使用其他其他統(tǒng)計圖,則依然需要手動創(chuàng)建 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./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 已經(jīng)改為使用 CrazyChartResult 了,這就允許 Struts 2 中 Action 只要提供 Dataset 即可。
將這些資源打包成 JAR 文件,即可放在項目中正常使用了。擴展后的 JFreeChart 插件可下載本文的 struts2-crazytjfreechart-plugin-2.1.6.jar 附件。
使用改進(jìn)后 JFreeChart 插件
提供了改進(jìn)后的 JFreeChart 插件之后,接下來開發(fā)者開發(fā)的 Action 就會簡單多了,下面的 Action 只有一個 getDataset() 方法,該方法返回創(chuàng)建 JFreeChart 的 Dataset 對象,不再需要手動創(chuàng)建 JFreeChart 對象——這個工作由擴展后的 JFreeChart 插件完成。
還是前面那個創(chuàng)建餅圖的示例程序,但此時的 Action 就簡單多了,下面是該 Action 類的代碼:
清單 5. ChartAction.java
public class ChartAction extends ActionSupport
{
// 獲取生成統(tǒng)計圖的 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 類已經(jīng)簡化多了,該 Action 只需提供一個 Dataset 即可,剩下的事情都交給 JFreeChart 插件來完成。
當(dāng)然,開發(fā)者還應(yīng)該告訴 JFreeChart 需要創(chuàng)建怎樣的統(tǒng)計圖、統(tǒng)計圖的標(biāo)題等必要信息,因此配置該 Action 時需要更多的參數(shù),下面是該 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./dtds/struts-2.1.dtd">
<struts>
<!-- 配置 Struts 2 應(yīng)用中的常量 -->
<constant name="struts.custom.i18n.resources"
value="messageResource"/>
<constant name="struts.i18n.encoding" value="GBK"/>
<!-- 配置本應(yīng)用中的包,繼承 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>
<!-- 指定統(tǒng)計圖的標(biāo)題 -->
<param name="title">Test Title</param>
<!-- 指定創(chuàng)建一個餅圖 -->
<param name="chartType">pieChart</param>
</result>
</action>
</package>
</struts>
|
上面配置文件中粗體字代碼指定了創(chuàng)建統(tǒng)計圖的類型(餅圖)、統(tǒng)計圖的標(biāo)題,提供了這些必要信息之后,JFreeChart 插件即可根據(jù) Action 提供的 Dataset、配置文件中提供的統(tǒng)計圖標(biāo)題、統(tǒng)計圖類型自動生成統(tǒng)計圖。在瀏覽器中直接向 bookChart.action 發(fā)送請求,將看到如圖 3 所示的統(tǒng)計圖。
圖 4. 使用改進(jìn)后的 JFreeChart 插件
從圖 4 可以看出,改進(jìn)后的 JFreeChart 插件可以根據(jù) Action 提供的 Dataset 來生成統(tǒng)計圖,但需要指出的是:采用這種方式生成的統(tǒng)計圖顯然無法設(shè)置太多的自定義屬性——這是因為 JFreeChart 插件負(fù)責(zé)根據(jù) Dataset 來創(chuàng)建 JFreeChart,而 JFreeChart 插件顯然沒法根據(jù)具體項目進(jìn)行定制。
由此可見,改進(jìn)后的 JFreeChart 插件用起來更方便;如果開發(fā)者需要獲得對 JFreeChart 全部的控制,則依然可以在 Action 中手動創(chuàng)建 JFreeChart,從而彌補靈活性不足的缺點。
回頁首 小結(jié)
JFreeChart 是一個非常優(yōu)秀的統(tǒng)計圖表工具,對于實際企業(yè)開發(fā)具有非常重要的作用。Struts 2 作為一個強大前端 MVC 框架,已經(jīng)提供了對 JFreeChart 的封裝,不過這種封裝對于實際開發(fā)來說顯得還不夠簡潔。本文主要從簡潔、易用的角度對 Struts 2 的 JFreeChart 做了進(jìn)一步改進(jìn),使得實際項目中可以更方便使用 JFreeChart 來生成統(tǒng)計圖表。
|