在企業級 Web 應用中,數據可視化是常見需求。本文詳細介紹如何在 Struts 1.x 框架中整合 JFreeChart 庫,實現動態生成統計圖表並顯示在 JSP 頁面的完整流程,包含後端數據準備、圖表生成邏輯、Session 管理及前端展示關鍵代碼。
首先定義數據傳輸對象 RepVteachStatic 封裝統計維度(如機構名稱),並通過 Service 層查詢各維度對應的數值(如參加人數):
List orgCourseList = ...; // 從數據庫查詢機構列表
int n = orgCourseList.size();
int[] Num = new int[n]; // 存放人數統計
String[] orgName = new String[n]; // 存放機構名稱
for (int i = 0; i < n; i++) {
RepVteachStatic temp = (RepVteachStatic) orgCourseList.get(i);
int personNum = repVteachStaticService.getOrgCoursePersonNum(temp);
Num[i] = personNum;
orgName[i] = temp.getOrg_name();
}
使用 JFreeChart 的 ChartFactory 快速創建 3D 餅圖,並通過 ServletUtilities 將圖表保存為 PNG 文件到 Session 中,返回可訪問的 URL:
public void getOrgCoursePieChart(int[] Num, String[] orgName, String title) {
// 1. 構建數據集
DefaultPieDataset data = new DefaultPieDataset();
for (int i = 0; i < Num.length; i++) {
data.setValue(orgName[i], Num[i]);
}
// 2. 創建 3D 餅圖
JFreeChart chart = ChartFactory.createPieChart3D(
title, data, true, false, false
);
chart.setBackgroundPaint(java.awt.Color.green); // 設置背景色
// 3. 保存為臨時文件並生成訪問 URL
try {
ChartRenderingInfo info = new ChartRenderingInfo(new StandardEntityCollection());
HttpSession session = ActionContext.getActionContext().getRequest().getSession();
HttpServletRequest request = ActionContext.getActionContext().getRequest();
// 關鍵:保存圖表到 Session,返回文件名
String filename = ServletUtilities.saveChartAsPNG(chart, 500, 300, info, session);
// 構建圖表訪問路徑:/servlet/DisplayChart?filename=xxx
graphURL = request.getContextPath() + "/servlet/DisplayChart?filename=" + filename;
} catch (Exception e) {
e.printStackTrace();
}
}
需在 web.xml 中配置 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>
在 JSP 中使用 Struts 標簽輸出圖表 URL:
<img src="<bean:write name="repVteachStaticBean" property="graphURL"/>" />
JFreeChart 對象渲染為 BufferedImageHttpSession 的 Map 中,鍵為文件名JFreeChart 生成的臨時圖片存儲在 Session 中,若不及時清理會導致內存洩漏。建議:
HttpSessionBindingListener 監聽 Session 銷毀事件清理圖片// 設置標題字體解決中文亂碼
TextTitle chartTitle = new TextTitle(title, new Font("微軟雅黑", Font.BOLD, 16));
chart.setTitle(chartTitle);
// 設置圖例字體
PiePlot plot = (PiePlot) chart.getPlot();
plot.setLabelFont(new Font("微軟雅黑", Font.PLAIN, 12));
plot.setLegendLabelFont(new Font("微軟雅黑", Font.PLAIN, 12));
// 顯示百分比標籤
plot.setLabelGenerator(new StandardPieSectionLabelGenerator("{0}: {1} ({2})",
NumberFormat.getNumberInstance(), NumberFormat.getPercentInstance()));
| 問題 | 原因 | 解決方案 |
|---|---|---|
| 圖片顯示紅叉/404 | DisplayChart Servlet 未配置或映射路徑錯誤 | 檢查 web.xml Servlet 映射,確保 URL 模式匹配 |
| 中文顯示方塊/亂碼 | JFreeChart 默認字體不支持中文 | 設置標題、圖例、標籤字體為支持中文字體(如微軟雅黑、宋體) |
| 高併發下圖片丟失 | Session 緩存被清理或內存不足 | 改用文件/數據庫持久化存儲圖片,或增加 JVM 堆內存 |
| 圖表數據不更新 | 瀏覽器緩存同名圖片 | URL 添加時間戳參數:?filename=xxx&t=+System.currentTimeMillis() |
雖然 JFreeChart + Struts 1.x 是經典方案,但現代項目建議考慮:
本文完整演示了 Struts 1.x 整合 JFreeChart 生成動態圖表的全流程:數據準備 → 圖表創建 → Session 緩存 → Servlet 輸出 → JSP 顯示。掌握此技術可快速為傳統 Java Web 系統添加數據可視化能力,但新項目建議採用前端渲染方案獲得更佳性能與用戶體驗。