自定義標簽必須實現下面三個接口中的一個TagIterationTagBodyTag
Tag
如果要實現這個接口可以通過擴展TagSupport這個類來寫自己需要的方法而不需要把Tag接口中的所有方法實現
Tag接口的方法doStartTag()doEndTag()getParent()setParent()release()setPageContext()
在Tag類代碼中不能像jsp一樣直接使用out隱含對象他有一個對象可以使用pageContext通過它的getOut()方法可以得到out對象在標簽內部訪問任何的隱含對象都是通過調用pageContext的set方法
IterationTag
IterationTag接口與Tag接口類似用於當一個自定義標簽需要重復計算它的代碼體的情況下它擴展Tag接口並實現了一個新的方法doAfterBody()來實現循環這個方法只有從doStartTag()返回EVAL_BODY_INCLUDE時才被調用在執行doAfterBody()方法時如果返回的是EVAL_BODY_AGAIN那麼將再次執行doAfterBody()方法直到doAfterBody()返回的是SKIP_BODY或者EVAL_BODY_INCLUDE
BodyTag
BodyTag接口擴展了IterationTag並提供了對代碼體內容進行操作的功能就是在計算代碼體的時候可以對已經形成的代碼體進行修改BodyContent對象就是用來保存對自定義標簽體計算的結果它有一個新方法doInitBody()這個方法只有在doStartTag()方法返回EVAL_BODY_BUFFERED時才調用此時它將創建一個BodyContent對象保存結果
擴展自定義標簽
添加屬性
首先要在tld文件中加入一個屬性元素然後在java文件中需要定義這個屬性以及它的的setter方法屬性<attribute>元素有四個子元素分別是<name><required><rtexprvalue><description>這裡<rtexprvalue>表示的是屬性是否接受scriptlet表達式的計算結果默認情況下為false即只能接受靜態值
添加變量
可以在tld文件中給自定義標簽加入一個<variable>元素它的子元素包括<namegiven>表示保存變量的名字<variableclass>表示變量的java類型<declared>用boolean表示這個變量是否為新的<scope>表示變量的使用范圍(AT_BEGIN表示從起始標簽起AT_END表示從終止標簽後NESTED表示起始標簽和終止標簽之間)定義了變量之後需要在java文件中把這個變量用pageContextsetAttribute(object)這裡key值應該就是變量對外的名字
使用TagExtraInfo(TEI)類
這個對象中有兩類對象可以使用TagData(保存標簽屬性的信息)VariableInfo(描述代碼變量)
一段TagExtraInfo類代碼實例
public VariableInfo[] getVariableInfo(TagData data) {
String variableName = datagetAttributeString(name);
VariableInfo vi =
new VariableInfo(variableNameString [] true VariableInfoAT_END);
VariableInfo[] tagVariables = new VariableInfo[];
tagVariables[] = vi;
return tagVariables;
}
可以通過TagData類的getAttributeString方法得到某個屬性的值還有另外一個方法getAttribute也是得到某個屬性的值不過返回的是一個對象而getVariableInfo方法必須返回一個VariableInfo數組除此之外還需要在tld中的元素定義<tagclass>後加入一個<teiclass>元素說明TEI類的全稱
pageContext對象中含有的方法包括getOut()getPage()getRequest()getResponse()getServletConfig()getServletContext()getSession()
Tag接口中的返回常數意義
EVAL_BODY_INCLUDE告訴服務器正文的內容並把這些內容送入輸出流
SKIP_BODY告訴服務器不要處理正文內容
EVAL_PAGE讓服務器繼續執行頁面
SKIP_PAGE讓服務器不要處理剩余的頁面
[] []
From:http://tw.wingwit.com/Article/program/Java/ky/201311/29145.html