標籤庫產生的初衷
- 避免 JSP 混雜大量 Java 代碼,實現邏輯與顯示分離,提升可維護性。
- 擴展 HTML 語義,完成原生標籤無法表達的功能(迴圈、條件、格式化、組件化)。
正反雙方核心觀點
| 正方(支持) | 反方(反對) |
| 簡化 JSP 開發,擴展 HTML 能力 | 為避免 Java 代碼反而引入更多配置與類,增加總代碼量 |
| 封裝 HTML 片段為可復用頁面組件 | 學習成本高:每個框架、公司內部都有不同標籤庫 |
| IDE 工具支援可緩解維護負擔 | 面對頻繁變更的頁面邏輯,標籤組件維護成本極高,不如 JS 操作 DOM 靈活 |
爭論本質是編程哲學差異,JSF 強站正方,Struts 等框架保持中立「不拋棄、不放棄」。
標籤發展趨勢
正方演進
- JSTL 標準化核心邏輯/輸出標籤。
- IDE 整合豐富組件庫,融合 AJAX。
- 將成熟 JS UI 框架(如 ExtJS)包裝為 Taglib。
- EL 表達式語言普及,簡化數據綁定。
反方革新
- 拋棄 Taglib,擁抱模板引擎。
- 採用 JavaScript 豐富頁面交互(ExtJS、jQuery UI)。
- 徹底放棄 HTML,轉向 Flex/Flash 富客戶端。
標籤分類體系
| 類別 | 代表標籤 | 必要性 |
| 邏輯控制 | c:if, c:forEach, c:choose/when/otherwise, c:catch | 必不可少,構成程式基礎 |
| 數據輸出 | c:out, c:url, c:set, c:param, fmt:message, fmt:formatDate/Number | 必不可少,JSP 核心使命是展現數據 |
| 頁面組件 | Struts2 UI Tag, 自定義複雜組件 | 輔助性,可用 JS/模板替代 |
建議:前兩類必備,第三類謹慎引入,評估學習/維護成本。
主流框架標籤設計哲學對比
Struts / WebWork / Struts2
- 傳統三類標籤齊全,UI 組件化投入較大。
- 屬性命名貼近 HTML 原生,降低學習門檻。
- 保留態度:組件標籤實用性不如成熟 JS 框架。
JSTL
- 專注邏輯控制與數據輸出,無 UI 組件標籤。
- 從 page/request/session/application 多作用域查找值,框架無關。
- 標籤少、學習成本低,廣受歡迎。
Tapestry
- 獨創「HTML 純化」:無額外標籤,在原生標籤上增加
jwcid 屬性綁定組件。
- 號稱對美工最友好,但復雜邏輯下屬性密集同樣難讀。
- 思想可遷移:普通 JSP + HTML5 data-* 屬性 + JS 控制器同樣可構建組件體系。
理性選型建議
- 核心邏輯/輸出:優先 JSTL + EL,標準、穩定、框架中立。
- UI 組件:評估團隊 JS 能力,傾向成熟前端框架 + REST API,而非服務端標籤組件。
- 避免為「去除 Java 代碼」而引入更複雜的標籤體系,得不償失。