在企業級 Web 開發中,數據可視化是常見需求。雖然可以手繪圖形(如 Flash、SVG),但代碼量大且易出錯。商業圖表庫(如 JClass)又需付費。對於崇尚開源的開發者,JFreeChart 是最佳選擇:它支援柱狀圖、餅圖、雷達圖、K 線圖等多種圖表類型,適用於 C/S、B/S 甚至即時環境,且完全開源免費。本文將以餅圖為例,詳細演示如何在 JSP/Servlet 環境中整合 JFreeChart。
jfreechart.jar 和 jcommon.jar 放入專案的 Classpath 中(如 WEB-INF/lib)。建立 GSPieChart.java 封裝圖表生成與輸出邏輯:
package gov.gwssi.tax.nspg.datadisposal;
import java.awt.*;
import java.io.PrintWriter;
import javax.servlet.http.HttpSession;
import org.jfree.chart.*;
import org.jfree.chart.plot.Pie3DPlot;
import org.jfree.chart.servlet.ServletUtilities;
import org.jfree.chart.util.ChartRenderingInfo;
import org.jfree.chart.entity.StandardEntityCollection;
import org.jfree.data.general.DefaultPieDataset;
import org.jfree.chart.urls.StandardPieURLGenerator;
import org.jfree.chart.tooltips.StandardPieToolTipGenerator;
public class GSPieChart {
public static String generatePieChart(Long[] datas, String targetUrl,
HttpSession session, PrintWriter pw, int w, int h) {
String filename = null;
try {
// 1. 準備數據集
DefaultPieDataset dataset = new DefaultPieDataset();
dataset.setValue("正常納稅人", datas[0]);
dataset.setValue("異常納稅人", datas[1]);
dataset.setValue("數據不全納稅人", datas[2]);
dataset.setValue("未處理納稅人", datas[3]);
// 2. 配置 3D 餅圖屬性
Pie3DPlot plot = new Pie3DPlot(dataset);
plot.setInsets(new Insets(0, 5, 5, 5));
plot.setForegroundAlpha(0.6f);
plot.setLabelGenerator(null); // 不顯示標籤
plot.setURLGenerator(new StandardPieURLGenerator(targetUrl, "type")); // 圖片映射 URL
plot.setToolTipGenerator(new StandardPieToolTipGenerator()); // 提示訊息
// 3. 建立圖表物件並美化
JFreeChart chart = new JFreeChart("數據處理結果統計圖",
JFreeChart.DEFAULT_TITLE_FONT, plot, true);
chart.setTitle(new TextTitle("數據處理結果統計圖",
new Font("黑體", Font.BOLD, 15)));
chart.getLegend().setItemFont(new Font("黑體", Font.PLAIN, 12));
chart.setBackgroundPaint(new Color(254, 254, 141));
// 4. 輸出為暫存 PNG 並生成 ImageMap
ChartRenderingInfo info = new ChartRenderingInfo(new StandardEntityCollection());
filename = ServletUtilities.saveChartAsPNG(chart, w, h, info, session);
ChartUtilities.writeImageMap(pw, filename, info);
pw.flush();
} catch (Exception e) {
e.printStackTrace();
filename = "public_error_500x300.png";
}
return filename;
}
}
在 JSP 中實例化 JavaBean 並輸出圖片:
<%
String targetUrl = "../servlet/GSMainControlServlet?id=" + sid;
Long[] datas = {normals, new Long(totalAbnormal), dataLacks, notProcesses};
String filename = GSPieChart.generatePieChart(datas, targetUrl, session,
new PrintWriter(out), 580, 250);
String graphURL = request.getContextPath() + "/servlet/DisplayChart?filename=" + filename;
%>
<!-- 圖片輸出區塊 -->
<table width="580" border="0" cellspacing="0" cellpadding="0">
<tr>
<td>
<img src="<%= graphURL %>" width="580" height="250" border="0"
usemap="#<%= filename %>">
</td>
</tr>
</table>
JFreeChart 內建 DisplayChart Servlet 負責從 Session 讀取暫存圖片並輸出:
<servlet>
<servlet-name>DisplayChart</servlet-name>
<servlet-class>org.jfree.chart.servlet.DisplayChart</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DisplayChart</servlet-name>
<url-pattern>/servlet/DisplayChart</url-pattern>
</servlet-mapping>
session.removeAttribute("JFreeChart_Deleter") 清理。usemap 配合 ChartUtilities.writeImageMap 實現扇形區域點擊跳轉。Plot 實現類(如 CategoryPlot)即可支援柱狀圖、折線圖等。完整範例亦可參考 JFreeChart 發布包中的 jfreechart-sample.war。掌握此流程,即可在任何 Java Web 專案中快速引入專業級圖表功能。