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

JSP 自定義標籤完全指南:從入門到進階實戰

     編輯:J2EE

核心概念四要素

術語說明
標籤XML 元素,使 JSP 簡潔、可維護、支援多語言。名稱/屬性大小寫敏感。
標籤庫功能相關標籤的集合,打包為 JAR 便於跨專案重用。
TLD(標籤庫描述檔)XML 配置檔,定義標籤名、處理類、屬性、體內容類型等元資料。
標籤處理類實作 TagSupport 或 SimpleTag 介面的 Java 類,封裝標籤執行邏輯。

JSP 頁面引用標籤庫

<%@ taglib prefix="my" uri="/WEB-INF/mytags.tld" %>
<my:hello name="World" />
  • prefix:自訂前綴(避開保留字:jsp, jspx, java, servlet, sun, sunw)。
  • uri:對應 TLD 檔中 <uri> 元素,容器以此定位 TLD。

標籤處理生命週期

傳統 TagSupport(BodyTag)流程

  1. doStartTag():遇到起始標籤。回傳值決定體內容處理:
    • SKIP_BODY:忽略標籤體
    • EVAL_BODY_INCLUDE:正常執行標籤體
  2. doAfterBody()(可選):體內容處理後,可迭代處理(回傳 EVAL_BODY_AGAIN)。
  3. doEndTag():遇到結束標籤。回傳值決定頁面後續:
    • SKIP_PAGE:立即停止頁面執行
    • EVAL_PAGE:繼續執行

SimpleTag(JSP 2.0+)簡化模型

  • 單一方法 doTag() 封裝所有邏輯。
  • 透過 getJspBody().invoke(null) 輸出標籤體。
  • 無 doStartTag/doEndTag,狀態管理更簡單。

標籤屬性處理

標籤屬性對應處理類的 JavaBean 屬性(提供 setter/getter):

public class HelloTag extends SimpleTagSupport {
    private String name; // 屬性名
    public void setName(String name) { this.name = name; }
    public String getName() { return name; }
    
    public void doTag() throws JspException, IOException {
        getJspContext().getOut().write("Hello, " + name);
    }
}

TLD 中宣告屬性:

<attribute>
    <name>name</name>
    <required>true</required>
    <rtexprvalue>true</rtexprvalue> <!-- 支援 <%= ... %> 運算式 -->
</attribute>

標籤體內容類型

body-content說明
empty標籤無主體內容 <my:tag/>
scriptless主體可含 EL、JSTL、自定義標籤,不可含 Scriptlet(推薦)
tagdependent主體由標籤自行解析(如 SQL、模板語言)

TLD 檔案結構詳解

<taglib xmlns="..." version="2.1">
    <tlib-version>1.0</tlib-version>
    <short-name>myTags</short-name>
    <uri>/myTags</uri>
    
    <tag>
        <name>hello</name>
        <tag-class>com.example.HelloTag</tag-class>
        <body-content>scriptless</body-content>
        <attribute>
            <name>name</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
    </tag>
</taglib>

Web 應用部署與自動發現

  1. 將 TLD 放在 /WEB-INF/ 或 JAR 的 /META-INF/ 下。
  2. 容器啟動時掃描 *.tld,建立 URI 映射。
  3. web.xml 可選配置 <taglib> 顯式映射(通常不需要)。

進階:靜態資源快取與 ServletContext 整合

  • 標籤處理類可透過 PageContext.getServletContext() 讀取快取資源(如屬性檔、模板)。
  • 使用 ServletContextListener 在應用啟動時載入靜態資源至 ServletContext 屬性,避免重複 I/O。
  • Properties 類載入 key=value 靜態文本,支援國際化。

實戰建議

  1. 優先使用 SimpleTag:API 更簡潔,避免複雜狀態管理。
  2. 標籤庫模組化:打包為獨立 JAR,發布至內部 Maven 倉庫,多專案共享。
  3. 文檔化屬性與範例:TLD 中補充 <description>,降低團隊學習成本。
  4. 避免過度設計:簡單邏輯用 JSTL/EL 即可,標籤用於真正可重用的 UI 元件(如分頁、表單、選單)。

總結

JSP 自定義標籤是「視圖層重用」的核心機制。掌握 TLD 定義、處理類生命週期、屬性綁定與標籤體處理,能構建領域專用標籤語言(DSL),大幅提升頁面開發效率與一致性。現代框架(Spring MVC、JSF、Thymeleaf)皆內建標籤庫,理解底層原理有助於擴展與除錯。

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