首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Struts 整合 JFreeChart 動態生成圖表實戰指南

     編輯:Java 相關知識

前言

在企業級 Web 應用中,數據可視化是常見需求。本文詳細介紹如何在 Struts 1.x 框架中整合 JFreeChart 庫,實現動態生成統計圖表並顯示在 JSP 頁面的完整流程,包含後端數據準備、圖表生成邏輯、Session 管理及前端展示關鍵代碼。

核心實現步驟

1. 數據準備與 DTO 設計

首先定義數據傳輸對象 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();
}

2. 圖表生成核心方法

使用 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();
    }
}

3. Struts 配置與 Servlet 映射

需在 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>

4. JSP 頁面顯示圖表

在 JSP 中使用 Struts 標簽輸出圖表 URL:

<img src="<bean:write name="repVteachStaticBean" property="graphURL"/>" />

關鍵技術點解析

ServletUtilities.saveChartAsPNG 原理

  • 將 JFreeChart 對象渲染為 BufferedImage
  • 生成唯一文件名(通常包含時間戳和隨機數)
  • 將圖片緩存到 HttpSession 的 Map 中,鍵為文件名
  • 返回文件名供前端構建 URL

內存洩漏防範

JFreeChart 生成的臨時圖片存儲在 Session 中,若不及時清理會導致內存洩漏。建議:

  • 實現 HttpSessionBindingListener 監聽 Session 銷毀事件清理圖片
  • 或使用定時任務定期清理過期圖片緩存
  • 生產環境建議改用文件系統或 Redis 存儲圖片,減輕 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()));

常見問題與解決方案

問題原因解決方案
圖片顯示紅叉/404DisplayChart Servlet 未配置或映射路徑錯誤檢查 web.xml Servlet 映射,確保 URL 模式匹配
中文顯示方塊/亂碼JFreeChart 默認字體不支持中文設置標題、圖例、標籤字體為支持中文字體(如微軟雅黑、宋體)
高併發下圖片丟失Session 緩存被清理或內存不足改用文件/數據庫持久化存儲圖片,或增加 JVM 堆內存
圖表數據不更新瀏覽器緩存同名圖片URL 添加時間戳參數:?filename=xxx&t=+System.currentTimeMillis()

現代化替代方案

雖然 JFreeChart + Struts 1.x 是經典方案,但現代項目建議考慮:

  • 前端圖表庫:ECharts、Chart.js、Highcharts - 減輕後端壓力,交互體驗更好
  • REST API + 前端渲染:後端僅提供 JSON 數據,前端負責圖表渲染
  • Spring Boot + JFreeChart:若必須後端生成,升級至 Spring Boot 簡化配置

總結

本文完整演示了 Struts 1.x 整合 JFreeChart 生成動態圖表的全流程:數據準備 → 圖表創建 → Session 緩存 → Servlet 輸出 → JSP 顯示。掌握此技術可快速為傳統 Java Web 系統添加數據可視化能力,但新項目建議採用前端渲染方案獲得更佳性能與用戶體驗。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved