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

JSP 自定義標籤庫(Taglib)實戰:TagSupport、SimpleTagSupport、BodyTagSupport 三大體系完整案例

     編輯:Java 綜合教學

一、TagSupport 體系(經典 Body 標籤)

1. 資料庫查詢標籤 <tm:DBconnectionTag>

標籤處理器:繼承 TagSupport,實作 doEndTag() 執行 JDBC 查詢並輸出結果。

public class DBconnectionTag extends TagSupport {
    private String driver, url, username, password, sql;
    // setter/getter 省略
    public int doEndTag() throws JspException {
        try {
            Class.forName(driver);
            Connection conn = DriverManager.getConnection(url, username, password);
            Statement stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery(sql);
            while (rs.next()) pageContext.getOut().print(rs.getString("cname") + "<br/>");
            return EVAL_PAGE;
        } catch (Exception e) { return SKIP_PAGE; }
        finally { /* 關閉資源 */ }
    }
}

TLD 定義:指定屬性 driver、url 等,body-content>empty。

JSP 使用:

<%@taglib prefix="tm" uri="/WEB-INF/tag.tld" %>
<tm:DBconnectionTag url="jdbc:mysql://..." driver="com.mysql.jdbc.Driver"
    username="root" password="pwd" sql="select * from course"/>

2. 集合迭代標籤 <tm:foreach>

  • 支援 List、Set、Map(轉為 EntrySet)
  • 透過 doStartTag() + doAfterBody() 實現多次評估 Body
  • 將當前元素放入 pageContext 供 EL 表達式 ${var} 取用

3. 陣列迭代標籤 <tm:IteratorTagDemo>

  • 屬性 items 接收 String[]
  • 索引計數器 i 控制迭代

4. 防盜鏈標籤 <tm:SkipPageOrEvalPageTag>

  • doEndTag() 檢查 Referer 標頭
  • 合法返回 EVAL_PAGE,非法輸出「盜鏈」並返回 SKIP_PAGE 終止頁面執行

二、SimpleTagSupport 體系(JSP 2.0+ 推薦,更簡潔)

1. 通用迭代標籤 <tm:simpleforeachAll>

  • 統一處理 Collection、Map、陣列(含基本型別陣列透過反射轉 ArrayList)
  • 單一方法 doTag() 內完成迭代與 jspBody.invoke(null)

2. 防盜鏈標籤 <tm:referer>

  • 拋出 SkipPageException 直接中斷頁面
  • 支援相對/絕對路徑重導向

三、BodyTagSupport 體系(可操作 Body 內容)

標籤 <tm:bodyTag>

  • 取得 BodyContent 獲取標籤體字串
  • 透過 getEnclosingWriter() 向外層輸出修改後內容
  • 範例:將 <tm:bodyTag>hello</tm:bodyTag> 替換為 www.cnblogs.com/izhongwei

TLD 關鍵屬性對照

屬性說明
body-contentempty無體、scriptless無腳本、JSP/tagdependent任意內容
rtexprvaluetrue允許 EL/運行時表達式
requiredtrue屬性必填

最佳實踐建議

  • 新專案優先使用 SimpleTagSupport:API 更清晰、無 doStartTag/doAfterBody 狀態機複雜度。
  • 需操作標籤體內容(如模板引擎、壓縮 HTML)才用 BodyTagSupport。
  • 標籤類放在 WEB-INF/classes 或打包 JAR 放 WEB-INF/lib,TLD 放 WEB-INF/tlds/ 或 JAR META-INF/ 下。
  • 複雜邏輯移至 Service/DAO,標籤僅負責顯示協調。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved