Web開發歷經「CGI拼HTML → JSP/ASP/PHP腳本頁 → Model 1(頁面控制器) → Model 2(MVC) → 模板引擎/DSL」的演進。本文從歷史視角剖析模板技術與JSP的本質差異、四大核心要素、主流模板引擎對比,為架構選型提供決策框架。
演進時間軸
- 遠古:CGI/Servlet中
out.println("..."),代碼與標記耦合,維護地獄。
- 1999:Sun推出JSP,標記中嵌入Java片段(Scriptlet),「HTML裡寫代碼」稍好但未徹底分離。
- Model 1 (頁面控制器):JSP/ASP/PHP直接調用EJB/COM/CORBA組件,頁面既是Controller又是View,腳本邏輯與顯示邏輯混雜。
- Model 2 (MVC):Struts等框架引入Front Controller,Servlet做Controller,JSP做View,JavaBean做Model,實現關注點分離。
- 模板技術興起:PHPLIB Template、FastTemplate → Velocity、FreeMarker、JDynamiTe、Tapestry、Thymeleaf。核心主張:View零邏輯,純聲明式渲染。
模板技術四大核心要素
| 要素 | 說明 | 關鍵決策點 |
| 0. 模板語言 | 變量標識 + 表達式語句 | 強控制力(含邏輯) vs 弱控制力(純輸出);兼容HTML vs 非兼容 |
| 1. 模板文件 | 包含模板語言的文本文件 | 兼容HTML者可被設計工具預覽,復用性高 |
| 2. 數據對象 | 提供動態數據:Map / DOM / POJO | Map最通用;DOM用於XML/XSLT;POJO利用反射/JavaBean |
| 3. 模板引擎 | 解析模板、綁定數據、輸出結果 | 解析速度、緩存機制、擴展性、安全沙箱 |
模板語言三大處理難點
- 標量標記:
${var}(Velocity/FreeMarker)、{var}(JDynamiTe)、jwcid擴展屬性(Tapestry)。考量「所見即所得」設計師友好度。
- 條件控制:
#if ... #end(Velocity)、<!-- @if ... -->(JDynamiTe註釋式)、CSS類名切換(無邏輯模板)。建議:複雜條件移至Controller預計算好CSS類名,模板僅輸出。
- 迭代/循環:
#foreach(Velocity)、註釋块(JDynamiTe)、t:repeat(Tapestry)。通常較簡單,各引擎支持度好。
主流模板引擎深度對比
| 引擎 | 語言風格 | 控制力 | HTML兼容 | 數據綁定 | 特色 |
| Velocity | $var / #directive | 強(含賦值、include、條件、循環) | 否(非標準標記) | Map(Context) | 成熟穩定、語法簡潔、Java生態最廣 |
| FreeMarker | ${var} / <#directive> | 極強(宏、函數、類型系統、數字格式化) | 否 | Map/POJO/序列 | 功能最豐富、Spring Boot默認推薦、性能優秀 |
| JDynamiTe | {var} / 註釋<!-- @if --> | 弱(無邏輯,僅輸出) | 是(純HTML註釋) | POJO反射 | 設計師極友好、可與PHP模板互通 |
| XSLT | XML/XPath/XSL標簽 | 強(圖靈完備) | 否(輸出XML/HTML) | DOM + XPath | 標準化、跨語言、但學習曲線陡峭、調試痛苦 |
| Tapestry | 組件化 jwcid / OGNL | 組件級封裝 | 是(增強HTML) | POJO + 組件模型 | 組件化開發、狀態管理、但框架侵入性強 |
| Thymeleaf | th:*屬性 / 標準方言 | 中等(條件、循環、片段、布局) | 極高(天然HTML5) | Map/POJO/Bean | Spring生態首選、原型可直接瀏覽器打開、自然模板 |
JSP/JSTL vs 獨立模板引擎
| 維度 | JSP/JSTL | 獨立模板(FreeMarker/Thymeleaf) |
| 運行環境 | Servlet容器內編譯為Servlet | 獨立jar,可脫離容器單元測試 |
| 語法安全 | 可寫任意Java代碼(Scriptlet) | 沙箱限制,僅允許聲明式表達 |
| 工具支持 | IDE成熟 | Thymeleaf IDE支持極佳 |
| 性能 | 編譯後類執行極快 | 解析緩存後接近,FreeMarker極快 |
| 適用場景 | 老系統維護、團隊Java技能強 | 新項目、前後端分離、微服務聚合頁 |
架構選型決策樹
- 新項目 + Spring Boot → Thymeleaf(或前後端分離純API + Vue/React)。
- 高性能、大並發、模板邏輯複雜 → FreeMarker。
- 設計師深度參與、需「所見即所得」 → JDynamiTe或Thymeleaf。
- 維護老Struts/JSP系統 → JSTL + EL + 自定義標簽,漸進式重構,禁用Scriptlet。
- 跨語言模板共享(Java/PHP/Node) → Mustache/Handlebars(邏輯極少)。
模板技術本質是「占位符動態替換」。選型核心在於:在「模板表達能力」與「業務邏輯外移」之間找到團隊舒適的平衡點。沒有銀彈,只有適合當前上下文的選擇。