JSP/ASP/PHP 早期開發模式:HTML、SQL、業務邏輯、JavaScript 混雜在單一頁面。隨專案增長:
核心價值: 以「XML 標籤」封裝可重用代碼塊,實現「視圖層 DSL(領域專用語言)」。
| 傳統方案 | 標籤庫方案 |
|---|---|
| COM/EJB 元件:門檻高、開發慢、需專業工程師 | 會寫 JSP 就能寫標籤庫,零額外技能 |
| 大型團隊才用得起架構治理 | 中小專案同樣受益,降低門檻 |
| 代碼與標記混雜 | 頁面純標記,邏輯封裝於 Java 類 |
WEB-INF/lib 即可重用。最佳資源庫:jsptags.com。<%@ include %> 自定 <my:include>。| 組件 | 角色 | 技術實現 |
|---|---|---|
| JavaBean | 基礎代碼模塊,封裝業務邏輯/資料存取 | 標準 POJO,非標籤庫一部分,被標籤處理類調用 |
| 標籤處理類 | 核心引擎,引用 JavaBean、存取 PageContext、處理屬性/標籤體、輸出結果 | 繼承 TagSupport 或實作 SimpleTag |
| TLD (Tag Library Descriptor) | 元資料清單,定義標籤名、處理類、屬性、體內容類型、版本、URI | XML 檔案,置於 /WEB-INF/*.tld 或 JAR /META-INF/*.tld |
| web.xml 宣告 (可選) | 顯式映射 TLD 路徑與 URI | <taglib><taglib-uri>/myTags</taglib-uri><taglib-location>/WEB-INF/myTags.tld</taglib-location></taglib> |
發布封裝: 將上述所有打包為 mytags.jar,發布至 Maven 倉庫,專案引入依賴即用。
TLD 定義:
<taglib>
<uri>https://example.com/jaxp</uri>
<tag>
<name>transform</name>
<tag-class>com.example.JAXPTransformTag</tag-class>
<body-content>empty</body-content>
<attribute><name>xmlFile</name><required>true</required></attribute>
<attribute><name>xslFile</name><required>true</required></attribute>
</tag>
</taglib>
處理類:
public class JAXPTransformTag extends SimpleTagSupport {
private String xmlFile, xslFile;
// setter/getter
public void doTag() throws JspException, IOException {
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer(new StreamSource(xslFile));
transformer.transform(new StreamSource(xmlFile), new StreamResult(getJspContext().getOut()));
}
}
JSP 使用:
<%@ taglib prefix="jaxp" uri="https://example.com/jaxp" %>
<jaxp:transform xmlFile="c:/xml/data.xml" xslFile="c:/xml/style.xsl" />
一行標籤替代數十行 Java 代碼,設計師可直接使用。
SimpleTagSupport 推薦),處理屬性注入、生命週期、輸出。META-INF),發布。WEB-INF,web.xml 宣告。JSP 標籤庫以「XML 標籤」為介面、「Java 類」為實現,完美解決了「腳本混雜」與「重用門檻」雙重難題。它將視圖層提升為可組合、可擴展、可治理的元件體系,使「設計師設計、工程師實現、標籤連接」的協作模式成為現實。雖現代框架(JSF、Thymeleaf、Vue/React)以不同形式延續此思想,但理解標籤庫原理,仍是掌握 Java Web 視圖層演進脈絡的關鍵一環。