自定義標簽必須實現以下接口之一,官方提供對應支援類減輕開發負擔:
| 接口 | 支援類 | 適用場景 | 關鍵方法 |
|---|---|---|---|
| Tag | TagSupport | 簡單標簽,無需操作 Body | doStartTag, doEndTag |
| IterationTag | TagSupport | 需迭代 Body 內容 | doAfterBody |
| BodyTag | BodyTagSupport | 需讀取/修改 Body 內容 | doInitBody, setBodyContent |
BodyTagSupport 完整週期:
doStartTag() → 返回 EVAL_BODY_BUFFERED 創建 BodyContentsetBodyContent() 注入 Body 內容對象doInitBody() 初始化doAfterBody() → EVAL_BODY_AGAIN 繼續迭代,否則進入結束doEndTag() → EVAL_PAGE/SKIP_PAGErelease()常用返回常量:
EVAL_BODY_INCLUDE:輸出 Body 到頁面SKIP_BODY:忽略 BodyEVAL_BODY_BUFFERED:緩存 Body 供修改EVAL_BODY_AGAIN:重新評估 Body(僅 doAfterBody)EVAL_PAGE:繼續執行頁面SKIP_PAGE:終止頁面執行TLD 定義 <attribute>,Java 類提供 setXxx()。<rtexprvalue>true</rtexprvalue> 允許腳本表達式。
兩種方式:
<variable> + <name-from-attribute>/<name-given> + pageContext.setAttribute()getVariableInfo(TagData) 返回 VariableInfo[],TLD 添加 <tei-class>public VariableInfo[] getVariableInfo(TagData data) {
String varName = data.getAttributeString("name");
return new VariableInfo[] { new VariableInfo(varName, "String[]", true, VariableInfo.AT_END) };
}
isValid(TagData)TagLibraryValidator,驗證整個頁面 XML,配置在 TLD <validator>,功能更強但複雜度更高pageContext 提供九大隱含對象訪問入口:getOut()、getRequest()、getSession()、getServletContext() 等。
查找父標簽:findAncestorWithClass(this, ParentTag.class)。
TryCatchFinally 接口:doCatch(Throwable) 捕獲標簽異常,doFinally() 保證資源釋放<uri> + META-INF/Manifest.mf 實現標簽庫自動發現,無需 web.xml 映射TryCatchFinally 保證連接/流關閉掌握 Tag/IterationTag/BodyTag 三層接口體系、生命週期常量、TEI/Validator 驗證機制、頁面上下文訪問,即可開發出健壯、可複用、符合規範的企業級標簽庫。