JFreeChart 是 Java 領域最成熟的開源圖表庫,支援柱狀圖、餅圖、時間序列圖等豐富類型。本文示範在 Tomcat 5.x 環境下,透過 Servlet 動態生成 PNG 圖表並直接輸出至瀏覽器。
C:\Tomcat 5.0C:\j2sdk1.4.2_09C:\Tomcat 5.0\webapps\myServletsjfreechart-1.0.0-rc1,將以下 JAR 放入 WEB-INF/lib 及 JDK lib 目錄:
jfreechart-1.0.0-rc1.jarjcommon-1.0.0-rc1.jargnujaxp.jar<!DOCTYPE html>
<html>
<head><title>JFreeChart 動態圖表示例</title></head>
<body>
<h2>JFreeChart: 簡單的例子</h2>
<ul>
<li><a href="servlet/ServletDemo1">條形統計圖</a></li>
<li><a href="chart.html">可選圖表類型</a></li>
</ul>
</body>
</html>
<form action="servlet/ServletDemo2" method="POST"> <input type="radio" name="chart" value="pie" checked> 圓餅圖<br> <input type="radio" name="chart" value="bar"> 柱狀圖<br> <input type="radio" name="chart" value="time"> 時間序列圖<br> <input type="submit" value="生成圖表"> </form>
package com.jrefinery.chart.demo;
import java.io.IOException;
import javax.servlet.*;
import javax.servlet.http.*;
import org.jfree.chart.*;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.chart.ChartUtilities;
public class ServletDemo1 extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// 1. 準備資料集
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
dataset.addValue(10.0, "S1", "C1");
dataset.addValue(4.0, "S1", "C2");
// ... 省略其它資料行 ...
// 2. 建立圖表
JFreeChart chart = ChartFactory.createBarChart(
"Bar Chart", "Category", "Value", dataset,
PlotOrientation.VERTICAL, true, true, false);
// 3. 輸出 PNG
resp.setContentType("image/png");
try (OutputStream out = resp.getOutputStream()) {
ChartUtilities.writeChartAsPNG(out, chart, 400, 300);
}
}
}
DefaultCategoryDataset 以 (系列, 類別) 二維結構組織數據,適合柱狀/線圖。ChartFactory 提供靜態方法快速建立常見圖表,內部封裝 JFreeChart、Plot、Renderer 組裝邏輯。try-with-resources 關閉 OutputStream,避免連線洩漏;設定 Content-Type: image/png 讓瀏覽器正確渲染。WEB-INF/classes。WEB-INF/web.xml 註冊 Servlet 映射(省略,遵循標準 Servlet 2.3 規範)。https://localhost:8080/myServlets/ 測試。ChartUtilities.encodePNG() 實現 Base64 編碼,支援 <img src="data:image/png;base64,..."> 內嵌圖表。JFreeChart 的 ChartChangeListener 實現伺服器端圖表快取,降低高併發下的 CPU 開銷。