JPivot 是 Mondrian OLAP 引擎的官方表現層 Tag Library。其架構乍看異類:XML/XSLT 渲染 + 純 JSP TagLib 無 MVC 框架。但深入剖析,每個設計決策都精準命中 OLAP 報告的特殊需求。本文記錄漢化實踐與架構心得。
# 1. 資源檔漢化
find . -name "resources.properties" -exec sh -c '
native2ascii -encoding UTF-8 {} ${1%.properties}_zh.properties
' _ {} \;
# 2. JSPX/XSL 模板漢化
find WEB-INF/jpivot -name "*.xml" -exec sh -c '
cp {} ${1%.xml}_zh.xml
# 編輯 _zh.xml 替換英文標籤為中文
' _ {} \;
# 3. 確保 Locale 解析正確
# JPivot 依據 request.getLocale() 自動載入 _zh 後綴資源
| 維度 | Transform Engine (XSLT) | Template Engine (Velocity/FreeMarker) |
|---|---|---|
| 資料轉換 | 原生支援樹狀結構轉換、遞迴、排序、分組 | 需在 Java 層預處理為扁平結構 |
| 多重投影 | 同一 XML 輸入 → 多個 XSLT → 表格/圖表/導航 | 需多次準備不同 ViewModel |
| 瀏覽器端渲染 | 可輸出 XHTML+CSS 或直接輸出 XSL-FO → PDF | 僅限伺服端 HTML 生成 |
| 學習曲線 | 陡峭 (函數式、模板匹配、模式思維) | 平緩 (命令式、類 JSP 語法) |
| 除錯難度 | 高 (無斷點、錯誤訊息晦澀) | 低 (標準 Java 除錯) |
結論:OLAP 報告的「高度規則化樹狀結構 + 多重投影需求」完美契合 XSLT 的強項。Martin Fowler 雖批評 XSLT 略帶 LISP 風格,但在這個特定領域,它比任何 Template Engine 都高效。
JPivot 不基於 Struts/Spring MVC 等框架,而是完全建構於 JSP TagLib 之上。這看似反模式,實則是為了:
# 請求:testPage.jsp?query=mondrian
# 1. Controller 層 - testPage.jsp
根據 query 參數匹配 /WEB-INF/query/mondrian.jsp 獲取資料
# 2. Model 層 - mondrian.jsp
執行 MDX 查詢,結果放入 query01 變數
# 3. View 準備 - testPage.jsp (Transform Engine 步驟 1: Domain → Display Data)
根據查詢結果準備表格顯示所需資料結構
# 4. View 渲染 - testPage.jsp (Transform Engine 步驟 2: Display Data → Presentation)
使用 XSLT 渲染最終 OLAP 表格
# 5. 循環步驟 3-4 處理導航器、圖表
準備導航資料
渲染導航
準備圖表資料
渲染圖表
Martin Fowler 在《Patterns of Enterprise Application Architecture》中定義的 Transform Engine 兩步驟:
這種分離使得:
JPivot 最後釋出於 2010 年,現代 OLAP 前端建議:
| 方案 | 架構 | 優勢 |
|---|---|---|
| Pivot Table.js + Mondrian REST | 前後端分離、JS 渲染 | 互動流暢、現代 UI、無 XSLT 痛苦 |
| Apache Superset / Metabase | 完整 BI 平台 | 開箱即用、多資料源、權限管理 |
| Custom React/Vue + OLAP Provider | 完全可控 | 業務深度整合、效能最優 |