摘 要: 圖表的應用不但可以使數據的顯示更加清晰、直觀,而且可大大增強Web頁面的功能和顯示效果。針對目前實際應用中經常需要通過數據庫中的數據生成相應的圖表這一強大需求,介紹了JFreeChart中通過其提供的數據集合對象在JSP頁面中生成圖表的方法,并給出了生成餅圖和柱狀圖的具體方法和代碼。
關鍵詞: JFreeChart; JSP; Web; 圖表
中圖分類號:TP311.1 文獻標志碼:A 文章編號:1006-8228(2013)04-34-03
Generating charts in JSP by using JFreeChart
Zhang Yuye1, Ma Chunqing2
(1. Dept. of computer, Jinan Vocational Colleage, Jinan, Shandong 250014, China; 2. Jinan Information Engineering School)
Abstract: Using charts can not only make data be clearer, more intuitive, but also greatly enhance the Web page and display effects. Aiming at the strong request to generate corresponding charts through data in database in practical applications, a method to generate charts in JSP pages through the data set object supplied by JFreeChart is introduced. The concrete realization method and code of the pie chart and histogram are given.
Key words: JFreeChart; JSP; Web; chart
0 引言
在日常統計報表中我們經常需要用到各種圖表,這些圖表可以讓我們更加清晰直觀地看到數據的各種分布情況。EXCEL中提供了強大的圖表功能,利用這些功能我們可以輕松快捷地制作出所需的各種圖表。現在隨著網絡辦公及無紙化辦公的廣泛應用,人們也需要在網頁中能夠提供類似EXCEL中的圖表功能,能以圖表的形式來清晰直觀地顯示統計報表中的各種數據。JFreeChart是Java平臺上的一個開放的圖表繪制類庫,它完全使用Java語言編寫,可應用于Java Applications、Applets、Servlets和JSP等。利用JFreeChart可生成餅圖、柱狀圖、折線圖、時序圖、散點圖、甘特圖等平時所需的多種圖表,并且可以產生PNG和JPEG格式的兩種輸出[1],利用JSP可以很方便地獲取到生成的圖片,并在網頁中顯示。目前一些介紹JFreeChart使用的多是通過臨時添加一些數據來演示[2-4],而實際應用中圖表的數據通常來自于數據庫,關于如何獲取數據庫中的數據生成圖表介紹的相對較少,事實上這部分內容才是比較實用的。基于此,通過查閱各種參考文獻[5-7]和JFreeChart本身的開發文檔,本文以一個職工情況表為例,通過創建其各種職稱的分布情況的餅圖和柱狀圖,詳細介紹了在JSP中如何利用JFreeChart通過數據庫中的數據生成相應的圖表。
1 數據源
統計報表中的數據通常來自于數據庫。本文用的示例數據庫OAJSP中有一“職工情況表”,如表1所示。
現要統計其各種職稱的人數。職稱人數在表中并沒有直接體現出來,但通過一定的計算可以求出,像這種報表中數據不是直接來自于表中數據,而是需要經過計算得出的,最好是在數據庫中先建立相應的視圖,然后再對視圖進行操作,這樣操作相對簡便。對表1根據職稱建好的視圖(在此將生成的視圖命名為“職稱統計報表”)如表2所示。接下來就相當于直接對“職稱統計報表”這個虛擬表(視圖)進行操作。
2 開發環境
本文示例所采用的開發工具:MyEclipse 8.6,JDK:1.6;數據庫:Oracle 10g;JFreeChart:版本1.0.6。有些高版本的JFreeChart不能很好地支持中文,為了更好地支持中文,本文采用的是1.0.6版本。服務器:利用MyEclipse自帶的Tomcat。
開發前準備:要在JSP中使用JFreeChart,應先根據需要下載其相應版本的軟件,然后將其解壓到本地硬盤上。
導入相應的Jar包:將解壓后的JFreeChart1.0.6中lib目錄下的三個jar包:jfreechart-1.0.6.jar、gnujaxp.jar和jcommon-1.0.10.jar導入到當前工程的lib目錄下。
配置web.xml:JFreeChart生成的圖片應用于JSP時通常要利用其本身提供的Servlet文件,該Servlet文件在JFreeChart組件包中,使用時要將其配置到相應的web.xml文件中,配置方法如下:
3 圖表的建立
在JSP中利用JFreeChart生成圖表,通常分為三個步驟。
⑴ 建立數據集。數據集通常來自于數據庫,需要對數據庫進行操作來獲取所需數據。JFreeChart組件對這一過程進行了封裝,通過自定義的SQL語句即可獲取到已封裝好的數據集合對象。JfreeChart中常用的JDBC數據集合對象有3種,分別為JDBCCategoryDataset(JDBC填充類別數據集合)、JDBCPieDataset(JDBC填充餅形圖數據集合)、JDBCXYDataset(JDBC填充坐標軸數據集合)。
⑵ 創建JfreeChart對象。通常通過制圖工廠JfreeChartFactory提供的相對應的各種方法來創建各種圖表對象。
⑶ 獲取圖片。獲取生成的圖片,在JSP頁面中顯示。
3.1 餅圖的建立
“職工情況表”中各種職稱的統計人數已經建立了相應的視圖“職稱統計報表”,因此接下來就相當于直接對虛擬表“職稱統計報表”進行操作,也即餅圖的數據來源就是視圖“職稱統計報表”中的數據。
⑴ 建立數據集及創建圖表對象。在當前工程(在此設工程名為OAJSP1)的src目錄中新建一類文件PieChartUtil.java,用于與數據庫建立連接并取得職稱統計報表中的數據,同時根據數據集中的數據生成餅圖,代碼如下:
package db;
import java.awt.Font;
import java.text.NumberFormat;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.labels.StandardPieSectionLabelGenerator;
import org.jfree.chart.plot.PiePlot;
import org.jfree.data.general.PieDataset;
import org.jfree.data.jdbc.JDBCPieDataset;
public class PieChartUtil {
public static PieDataset initPieData() {
String driverName=\"oracle.jdbc.driver.OracleDriver\";
//數據庫驅動
String url=\"jdbc:oracle:thin:@localhost:1521:XE\";
//數據庫連接URL
String user=\"oajsp\"; //數據庫用戶名
String password=\"111111\"; //數據庫密碼
JDBCPieDataset dataset=1;
try { //通過JDBC創建數據集合
dataset=new JDBCPieDataset(url,driverName, user,
password);
String query=\"select 職稱,人數 from職稱統計報表\";
//SQL語句
dataset.executeQuery(query); //查詢并向數據集合中添加
數據 dataset.close(); //關閉數據庫連接
} catch (Exception e) {
e.printStackTrace(); }
return dataset; }
public static JFreeChart createChart() { //創建餅圖
JFreeChart chart=ChartFactory.createPieChart(\"職稱人數統
計\",initPieData(),true,true,1);
//參數分別表示圖表標題,數據集對象,是否顯示圖例,是否顯示提示文本,是否生成超鏈接
chart.getTitle().setFont(new Font(\"隸書\",Font.BOLD,25));
//設置標題字體
chart.getLegend().setItemFont(new Font(\"宋體\",Font.BOLD,
15)); //設置圖例類別字體
PiePlot plot = (PiePlot) chart.getPlot(); //獲取繪圖區對象
plot.setForegroundAlpha(0.5f); //設置前景透明度
plot.setLabelFont(new Font(\"宋體\",Font.PLAIN,12));
//設置分類標簽的字體
plot.setCircular(true); //設置餅形為正圓
plot.setLabelGenerator(new StandardPieSectionLabelGenerator(\"{0}={2}\",
NumberFormat.getNumberInstance(), NumberFormat
.getPercentInstance()));
//設置分類標簽格式為類別名稱及其所占百分比
return chart; } }
⑵ 在JSP中獲取生成的圖片。在OAJSP1工程Webroot目錄中新建一JSP文件(設文件名為pie.jsp),其代碼如下:
<%@ page language=\"java\" import=\"java.util.*\" pageEncoding
=\"GB2312\"%>
<%@ page import=\"org.jfree.chart.servlet.ServletUtilities,
db.PieChartUtil\"%>
<% String path=request.getContextPath();
String basePath=request.getScheme()+\"://\"+request
.getServerName()+\":\"+request.getServerPort()+path+\"/\";%>
<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01
Transitional//EN\">
\">
<% String fileName=ServletUtilities.saveChartAsJPEG
(PieChartUtil.createChart(),500,300,session);
String graphURL=request.getContextPath()
+\"/DisplayChart?filename=\"+fileName; %>

border=\"1\">
⑶ 啟動tomcat服務器,在瀏覽器中輸入http://localhost:8080/OAJSP1/pie.jsp,瀏覽相應的JSP文件,運行結果如圖1所示。
3.2 柱狀圖的建立
柱狀圖的建立過程與餅圖的建立過程大體相同。所不同的是建立餅圖用的是JDBCPieDataset數據集合,建立柱狀圖用的是JDBCCategoryDataset數據集合,不同的數據集合放在不同的包中,要根據需要引入所需的包。還有生成的餅圖和柱狀圖所需要進行的設置稍有不同,根據需要做相應的調整,最后在JSP頁面中要根據需要引入對應的類。具體步驟如下。
⑴ 建立數據集及創建圖表對象。在當前工程OAJSP1的src目錄中新建一類文件BarChartUtil.java,用于與數據庫建立連接并取得職稱統計報表中的數據,同時根據數據集中的數據生成柱狀圖,代碼如下:
package db;
import java.awt.Color;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.BarRenderer;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.jdbc.JDBCCategoryDataset;
public class BarChartUtil {
public static CategoryDataset initCategoryData() {
String driverName=\"oracle.jdbc.driver.OracleDriver\";
//數據庫驅動
String url=\"jdbc:oracle:thin:@localhost:1521:XE\";
//數據庫連接URL
String user=\"oajsp\"; //數據庫用戶名
String password=\"111111\"; //數據庫密碼
JDBCCategoryDataset dataset=1;
try { //通過JDBC創建數據集合
dataset=new JDBCCategoryDataset(url,driverName,
user,password);
String query=\"select 職稱,人數 from 職稱統計報表\";
//SQL語句
dataset.executeQuery(query); //查詢并向數據集合中添加數據
} catch (Exception e) {
e.printStackTrace(); }
return dataset; }
public static JFreeChart createChart() { //創建柱狀圖
JFreeChart chart=ChartFactory.createBarChart(\"職稱人數統
計\",\"職稱類別\",\"人數\",initCategoryData(),PlotOrientation
.VERTICAL,1,1,1);
CategoryPlot plot=chart.getCategoryPlot(); //獲取圖表區對象
plot.setBackgroundPaint(Color.white); //設置網格背景顏色
plot.setRangeGridlinePaint(Color.pink); //設置網格橫線顏色
BarRenderer renderer=new BarRenderer();
renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
renderer.setBaseItemLabelsVisible(true);
plot.setRenderer(renderer); //顯示每個柱的數值
return chart; } }
⑵ 在JSP中獲取生成的圖片。在OAJSP1工程Webroot目錄中新建一JSP文件(設文件名為bar.jsp),其代碼如下:
<%@ page language=\"java\" import=\"java.util.*\"
pageEncoding=\"GB2312\"%>
<%@ page import=\"org.jfree.chart.servlet.ServletUtilities,
db.BarChartUtil\"%>
<% String path=request.getContextPath();
String basePath=request.getScheme()+\"://\"+request
.getServerName()+\":\"+request.getServerPort()+path+\"/\"; %>
<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0
1 Transitional//EN\">
\">
<% String fileName=ServletUtilities.saveChartAsJPEG
(BarChartUtil.createChart(),500,300,1,session);
String graphURL=request.getContextPath()+
\"/DisplayChart?filename=\"+fileName; %>
border=\"1\">
⑶ 啟動tomcat服務器,在瀏覽器中輸入http://localhost:8080/OAJSP1/bar.jsp,瀏覽相應的JSP文件,運行結果如圖2所示。
4 結束語
圖表的應用不但可以使得數據的顯示更加清晰、直觀,而且能大大增強Web頁面的功能和顯示效果。JFreeChart能夠制作的圖表有很多種,但JFreeChart只提供了幾種常用的數據集合對象,對于沒有提供數據集合對象的圖表,制作時需要自己進行底層數據庫操作的封裝,其實現過程相對復雜一些。本文介紹的利用JFreeChart中的數據集合對象來獲取數據庫中的數據在JSP中生成圖表的方法,其實現簡單方便,具有通用性,應用廣泛。
參考文獻:
[1] 朱賀新,穆榮,盧建軍.JFreeChart的應用開發與改進[J].西安科技大學學報,2008.12(28):789-791
[2] 王征強.利用JFreeChart開發包繪制圖表[J].刑臺職業技術學院學報,2007.2(24):38-41
[3] 李村合,張培穎.基于J2EE的Java繪圖方法研究與實現[J].微計算機應用,2005.26(4):49-451
[4] 劉艷霞.JFreeChart在JSP開發中的應用心得[J].工程地質計算機應用,2005.1:14-16
[5] 李伯宇,趙麗麗.在JSP中實現動態圖表方法研究[J].計算機應用,2003.23(6):213-214
[6] 候俁,劉萬軍.JFreeChart在JavaWeb項目中的應用[J].科學技術與工程,2008.5(8):2699-2700
[7] 王國輝.Java Web開發實戰寶典[M].清華大學出版社,2010.