小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Struts 2 中 JFreeChart 插件的使用分析和功能改進(jìn)

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 生成的餅圖

從圖 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 餅圖
圖 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

Struts 2.1 的改進(jìn)
JFreeChart 插件要求用戶的 Action 中 JFreeChart 類型的屬性名只能是 chart(必須提供 getChart() 方法,且該方法返回 JFreeChart 對象),這種硬編碼方式提供的統(tǒng)計圖表大大降低了 Action 的靈活性。Struts 2.1 改進(jìn)了這個地方,開發(fā)者允許使用任何方法返回一個 JFreeChart 對象。假如開發(fā)者提供了 getAbc() 方法返回一個 JFreeChart 對象,那需要開發(fā)者配置 Action 時配置一個名為 value 的參數(shù)。也就是增加如下配置:

將 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)計圖
圖 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 插件

從圖 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)計圖表。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多