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

JSP自定義標簽庫開發全流程:從TagHandler到TLD再到JSP調用

     編輯:關於JSP

自定義標簽讓JSP頁面擺脫Scriptlet,實現「聲明式標記+Java邏輯分離」。本文系統講解標簽庫核心概念、標簽處理類開發、TLD描述文件編寫、web.xml配置、JSP頁面引用的完整鏈路,並深度解析TagSupport核心屬性與生命週期。

核心概念四要素

概念說明
標簽XML元素,名稱/屬性區分大小寫,如<mytag:hello name="world"/>
標簽庫功能相關標簽的集合,如日期格式化庫、權限控制庫
TLD (Tag Library Descriptor)XML配置文件,定義標簽名→處理類映射、屬性規則、體內容類型
標簽處理類Java類,繼承TagSupport或實現SimpleTag,封裝標簽運行時邏輯

JSP頁面引用標簽庫雙條件

<%@ taglib prefix="my" uri="/WEB-INF/tlds/mytags.tld" %>
<my:hello name="world"/>
  1. prefix:命名空間前綴,頁面內相同前綴屬同一庫(禁用jsp, jspx, java, servlet, sun, sunw保留字)。
  2. uri:容器據此定位TLD文件(掃描WEB-INF/**/*.tld、jar包META-INF/*.tld),建立URI→TLD映射。

容器標簽解析執行流程(10步)

  1. JSP引用標簽<my:hello>。
  2. 容器根據prefix="my"找到taglib指令的uri。
  3. 根據uri在web.xml找到<taglib-uri>映射的<taglib-location>。
  4. 讀取TLD文件路徑(如/WEB-INF/tlds/mytags.tld)。
  5. 解析TLD,找到<name>hello</name>對應的<tag-class>。
  6. 實例化標簽處理類(new HelloTag())。
  7. 調用setPageContext(pageContext)、setParent(parentTag)注入上下文。
  8. 調用屬性Setter(setName("world"))。
  9. 調用doStartTag()返回EVAL_BODY_INCLUDE或SKIP_BODY。
  10. 若有體內容,處理體;最後調用doEndTag()返回EVAL_PAGE。

創建標簽庫四步驟

  1. 編寫處理類:繼承TagSupport,實現doStartTag()/doEndTag()。
  2. 編寫TLD:定義<tag><name><tag-class><attribute>等元素。
  3. 配置web.xml:<taglib><taglib-uri>/myTags</taglib-uri><taglib-location>/WEB-INF/tlds/mytags.tld</taglib-location></taglib>(Servlet 2.4+可省略,容器自動掃描)。
  4. JSP引用:<%@ taglib prefix="my" uri="/myTags" %>。

TagSupport核心屬性與生命週期鉤子

屬性/方法說明調用時機
pageContext頁面上下文,訪問request/session/application/out等setPageContext()最先調用
parent父標簽處理類實例(巢狀標簽)setParent()緊隨其後
doStartTag()開始標簽邏輯,返回EVAL_BODY_INCLUDE/SKIP_BODY/EVAL_BODY_BUFFERED屬性設置後、體處理前
doEndTag()結束標簽邏輯,返回EVAL_PAGE/SKIP_PAGE體處理後
release()釋放資源,重置字段供下次復用標簽實例池化回收時

關鍵注意事項

  • 構造器中不可訪問pageContext:此時容器尚未調用setPageContext(),屬性為null。
  • 屬性類型用Object支持EL:private Object attr; + setAttr(Object v)內調用ExpressionEvaluatorManager.evaluate()。
  • 線程安全:容器可能池化復用標簽實例,release()必須清理所有字段狀態。
  • 體內容類型:empty(無體)、JSP(有體且需評估)、tagdependent(體作為原文傳遞)。

現代化演進:SimpleTag (JSP 2.0+)

實現javax.servlet.jsp.tagext.SimpleTag接口,單一方法doTag(),無doStartTag/doEndTag分裂,體內容通過getJspBody().invoke(null)控制,API更簡潔、無池化線程安全憂慮。新項目優先選SimpleTag或標簽文件(.tag)。

掌握標簽庫開發全鏈路,是構建項目級DSL(領域特定語言)、統一UI組件庫、封裝跨頁面邏輯的關鍵能力。

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