JFreeChart在JSP開發中的應用心得

WWW的發展使得基於因特網的應用程序不再侷限於靜態或者簡單的動態內容提供。傳統的一些以軟件包形式發佈的應用程序,例如報表系統等,都被逐漸搬到了因特網上。但是這兩者之間有着天壤之別,雖然對於數據獲取、業務處理等方面基本類似,但是最大的差別在於用戶界面。爲了能在web瀏覽器上顯示所需的用戶界面,需要使用HTML以及圖片的方式來展現數據。傳統的一些利用操作系統本身的控件來開發的用戶界面就無法適應琳琅滿目的客戶端需求。爲了可以在web瀏覽器上查看到圖表,一般有兩種做法:第一種就是使用applet利用java本身對圖形的支持來顯示一個圖表;第二種就是直接在web服務器端生成好圖表圖片文件後發送給瀏覽器。第一種方式顯然對於客戶端要求太高,隨着現在主流瀏覽器放棄對JAVA的支持後,這種方式只適合一些局域網的應用,而對於因特網的環境就顯得不太適合。因此,可以選用JAVA的圖表引擎JFreeChart以產生基於WEB的圖表。

JFreeChart是一個開源的JAVA項目,它主要用來開發各種各樣的圖表,這些圖表包括:餅圖、柱狀圖(普通柱狀圖以及堆棧柱狀圖)、線圖、區域圖、分佈圖、混合圖、甘特圖以及一些儀表盤等等。在這些不同式樣的圖表上可以滿足目前商業系統的要求。JFreeChart是一種基於JAVA語言的圖表開發技術。JFreeChart可用於ServletJSPAppletJava Appication環境中,通過JDBC可動態顯示任何數據庫數據,結合Itext可以輸出至PDF文件。

JFreeChart主要是由三個類構成:

Aorg.jfree.chart.servlet.ChartDeleter繼承自HttpSessionBindingListener,用於實現當Session 關閉時,刪除臨時目中的圖象文件。

Borg.jfree.chart.servlet.DisplayChart繼承自Httpservlet 用於處理顯示圖象。

Corg.jfree.chart.servlet.ServletUtilities有一系列方法,例如,saveChartAs*;saveChartAs*是把圖表按照不同的形式存儲爲圖象;sendTempFile方法被重載了很多次,用於把文件流發送response

下面以柱狀圖和餅圖爲例,介紹圖形創建方法。

1 柱狀圖

org.jfree.chart.ChartFactory這個工廠類有createBarChartcreateStackedBarChartcreateBarChart3DcreateStackedBarChart3D,這幾個工廠方法創建不同類型的柱狀圖,比較重要的是 PlotOrientation.VERTICAL 讓平行柱垂直顯示,而 PlotOrientation.HORIZONTAL 則讓平行柱水平顯示。對柱狀圖影響較大的幾個類包括:org.jfree.chart.axis.CategoryAxisorg.jfree.chart.axis.ValueAxisorg.jfree.chart.renderer.BarRendererorg.jfree.chart.renderer. BarRenderer3D

具體實現步驟:

1)創建用於圖形生成所要的數據集對象。

CategoryDataset dataset = DatasetUtilities.createCategoryDataset(rowKeys, columnKeys, data)

其中:rowKeys表示X軸數據,columnKeys表示Y軸數據,data表示填充柱狀圖所要的實際數據(來自於數據庫)。

2)創建圖形對象。

JFreeChart chart = ChartFactory.createBarChart3D("標題", nullnulldatasetPlotOrientation.VERTICAL,truefalsefalse)

createBarChart3D方法是ChartFactory工廠類裏的一個方法,用於3D柱狀圖的生成,該類繼承自JFreeChart。其中的八個參數分別代表:圖形的標題、X軸標題、Y軸標題、dataset就是CategoryDataset類的實例對象、顯示標題、啓用熱鍵、啓用超鍵接。

3)設置圖形顯示的屬性。

a ) ValueAxis類,設置柱到圖上下邊的距離。實現方法是:

ValueAxis rangeAxis = plot.getRangeAxis();

設置最高的一個柱與圖片頂端的距離:

rangeAxis.setUpperMargin(0.15)

設置最低的一個柱與圖片底端的距離:

rangeAxis.setLowerMargin(0.15)

borg.jfree.chart.renderer.BarRenderer3D類,設置圖形上顯示的數值。實現方法如下:

BarRenderer3D renderer = new BarRenderer3D();

renderer.setBaseOutlinePaint(Color.BLACK);

設置 Wall 的顏色:

renderer.setWallPaint(Color.gray);

設置每個柱的顏色:

renderer.setSeriesPaint(0, new Color(0, 0, 255));

renderer.setSeriesPaint(1, new Color(0, 100, 255));

renderer.setSeriesPaint(2, Color.GREEN);

設置每個柱的 Outline 顏色
renderer.setSeriesOutlinePaint(0, Color.BLACK);

renderer.setSeriesOutlinePaint(1, Color.BLACK);

renderer.setSeriesOutlinePaint(2, Color.BLACK);

設置每個地區所包含的平行柱之間的距離
renderer.setItemMargin(0.1);

顯示每個柱的數值,並修改該數值的字體屬性

renderer.setItemLabelGenerator(new StandardCategoryItemLabelGenerator());

renderer.setItemLabelFont(new Font("黑體",Font.PLAIN,12));

renderer.setItemLabelsVisible(true);

爲圖形加入超連接

renderer.setItemURLGenerator(new StandardCategoryURLGenerator());

renderer.setToolTipGenerator(new StandardCategoryToolTipGenerator());

2 餅圖

org.jfree.chart.plot包,包含創建餅形圖的所有方法和屬性。

筆者根據業務需求創建了setURLGenerator(PieURLGenerator generator)方法,在圖片上建立連接,就是圖片不同部分連接不同的資源。

setSectionLabelType(int type)方法:

指定 section 標籤的類型,共有 7 種類型。如果不指定,默認是 NAME_LABELS,其中類型分別是:

PiePlot.NO_LABELS

PiePlot.NAME_LABELS

PiePlot.VALUE_LABELS

PiePlot.PERCENT_LABELS PiePlot.NAME_AND_VALUE_LABELSPiePlot. NAME_AND_PERCENT_LABELSPiePlot.VALUE_AND_PERCENT_LABELS

setDefaultOutlinePaint(java.awt.Paint paint)方法,指定 section 輪廓線的顏色,如果不指定,默認值爲NULL

setDefaultOutlineStroke(java.awt.Stroke stroke)方法,指定 section 輪廓線的厚度。

setRadius(double percent) setExplodePercent(int section, double percent)方法,抽離 section,就是把某一section從餅形圖剝離出來,需要兩個方法一起使用。

setStartAngle(double angle)方法,設置第一個section開始位置,默認從12點鐘方向開始。

setPaint(int section, java.awt.Paint paint)方法指定section的顏色。

setDirection(int direction)方法指定section順序,默認是順時針方向。順時針:PiePlot.CLOCKWISE;逆時針:PiePlot.ANTICLOCKWISE

具體實現步驟:

1)創建用於圖形生成所要的數據集對象。

首先實例化類DefaultPieDataset dataset = new DefaultPieDataset()。然後利用DefaultPieDataset類提供的setValuevalue1,value2)方法,把從數據庫裏提取的數據存入DefaultPieDataset對象。其中value1是數據名稱、value2是數據值。

2)創建圖形對象。

首先實例化JFreeChart chart = ChartFactory.createPieChart3D(title, dataset, true, true, false)createPieChart3D方法是用於餅圖生成的主要方法。其中title代表圖形的標題、dataset就是DefaultPieDataset對象的實例。

3)設置圖形顯示的屬性。

String filename = ServletUtilities.saveChartAsPNG(jFreeChart, 700, 450, info, session);

ChartUtilities.writeImageMap(pw, filename, info);

pw.flush()

saveChartAsPNG方法在ServletUtilities工廠類定義完成。主要用於把圖形對象JFreeChart以圖片的形式保存。其中的jFreeChart就是JFreeChart對象的實例。該方法返回一個文件名。

writeImageMappw, filename, info)方法用於把保存的圖片文件以字節流的形式寫入用戶界面。

其中pwjava.io包的PrintWriter類的實例對象,該對象創建一個圖形輸出流。Filename是輸出圖片的文件名。該文件名來自ServletUtilities.saveChartAsPNG方法創建。

參數info用於圖形信息的顯示。

ChartRenderingInfo info=new ChartRenderingInfo(new StandardEntityCollection())創建。

最後輸出完成圖形,調用pw.flush()方法關閉IO流。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章