EVAL_BODY_AGAIN讓服務器繼續處理正文內容只有doAfterBody方法可以返回
EVAL_BODY_BUFFEREDBodyTag接口的字段在doStartTag()返回
EVAL_BODY_INCLUDESKIP_BODY一般由doStartTag()返回而EVAL_PAPGESKIP_PAGE由doEndTag()返回
在調用doStartTag()方法之前其實標記還調用了其他兩個方法setPageContext()和setParent()所以在後面的方法中可以使用pageContext和parent對象如果需要的話
讓自定義標簽在頁面中創建對象時必須使用一個標准的JSP對象TagExtraInfo類它可以創建腳本變量還可以在編譯的時候對標簽進行檢驗TEI類僅可以生成由setAttribute方法存儲在PageContext對象中的變量而並不是單獨生成變量
通過TEI類定義腳本變量可以讓使用者自己定義在頁面中使用對象的名稱
除了使用TEI類方法之外還可以簡單的在TLD中定義一個<variable>對象來使用自定義對象用法如下
<variable>
<namefromattribute>name</namefromattribute>
<variableclass>String []</variableclass>
<declare>true</declare>
<scope>AT_END</scope>
</variable>
對於variable的子元素<namefromattribute>指的是創建的變量名稱從屬性name中來取得當然也可以通過<namegiven>元素來限制變量的名稱注意這兩個元素是互斥的
一個擴展BodyTagSupport的自定義標記的生命周期如下
創建標記
調用Setter方法
調用doStartTag()方法
調用setBodyContent()方法
調用InitBody()方法
處理標記的Body
doAfterBody()根據返回值如果為EVAL_BODY_AGAIN繼續執行如果不是執行
調用doEndTag()方法
判斷標記是否需要重用如果要執行否則執行release()方法
TagSupport類的方法findAncestorWithClass()方法可以用來查找指定的父類它有兩個參數一個為本身的類名還有一個就是要查找的父類的名稱如果沒有返回null例如ParentTag parent = (ParentTag) thisfindAncestorWithClass(thisParentTagclass)
自定義標記的驗證方法JSP TEI類可以在編譯時刻檢驗自己的標記這個類中有一個isValid()方法如果TLD中為這個標記定義了這個TEI類那麼網頁在編譯的時候將會調用這個方法並且會傳入一個包含屬性具體內容的參數TagData(在JSP中同樣有效)
JSP JSP中引入一個新的標記檢驗方法定義了一個新類TagLibraryValidator並且可以由此派生出檢驗標志的類大多數情況下僅使用這個類的validate()方法它有三個參數prefix(在taglib指令中定義的前綴)uri(TLD文件中的URI)page(JSP頁的PageData XML版本)validate()方法返回值為null時表示驗證成功否則返回的String類型將是一個錯誤信息
當validator在TLD文件中定義時它應該放在<tag>元素定義的外面因為它是用來處理驗證標記庫中的所有標記的
<validator><validator
class></validator
class></validator>
比較JSP和JSP中的方法TagLibraryValidator比TEI類更全面可以用來檢測整個網頁而不僅僅是標記本身可以用來處理標記間的合作並且這種方法可以用來通知程序員錯誤出在哪裡但是同時它的方法也比TEI類的方法復雜多了因為它需要遍歷整個XML版本的JSP(完成getAttributeValue方法)
JSP中的TryCatchFinally接口這個接口主要是用於當自定義標記出現異常時釋放自定義標記中的資源使用的它定義了兩個方法public void doCatch(Throwable t)(當doStartTagdoInitBodydoAfterBodydoEndTag方法出現異常時會調用這個方法)
piblic void doFinally()(當doEndTag被調用後無論是否出現異常都會調用這個方法就像程序中的finally塊可以用來釋放資源)
在JSP中可以通過在tld文件中加入一個元素<uri></uri>來指定自己的在taglib指令中使用的名稱然後把這個tld文件與Manifestmf一起放在METAINF目錄中那麼在頁面中就可以非常方便地導入這些tld
編寫自定義標記的原則
使用腳本變量(允許設計者為腳本變量起名將腳本變量的數量減到最小使用一個組合腳本對象和存取函數即使用JavaBean)
當設計相互協作的標記時應該盡量避免創建一套新的語言應當盡量使用腳本變量編寫代碼而不是內容不要在自定義標記中產生HTML這樣會失去通用性
[] []
From:http://tw.wingwit.com/Article/program/Java/ky/201311/29146.html