一般我們說(shuō)自定義標(biāo)簽是指JSP自定義標(biāo)簽。自定義標(biāo)簽在功能上和邏輯上與javaBean 類(lèi)似,都封裝Java 代碼。自定義標(biāo)簽是可重用的組件代碼,并且允許開(kāi)發(fā)人員為復(fù)雜的操作提供邏輯名稱。我們?cè)谥暗恼n程中講解過(guò)
自定義EL函數(shù)庫(kù),今天的自定義標(biāo)簽跟它有些類(lèi)似。
我們自定義的標(biāo)簽是動(dòng)作標(biāo)簽,可以理解為每個(gè)標(biāo)簽就是一個(gè)對(duì)象,有對(duì)象就必然有對(duì)應(yīng)的類(lèi),那么標(biāo)簽的功能就在對(duì)應(yīng)類(lèi)的某個(gè)方法中實(shí)現(xiàn)。下面我們來(lái)學(xué)習(xí)自定義標(biāo)簽的步驟,具體如下:
l 定義一個(gè)標(biāo)簽處理類(lèi);
l 創(chuàng)建一個(gè)tld文件,該文件本身是一個(gè)xml文件;
l 在頁(yè)面中使用<%@taglib%>指令來(lái)指定tld文件的位置。
在JavaEE幫助文檔中定義了與標(biāo)簽相關(guān)的類(lèi),如圖1-1所示:
圖1-1 Tag接口
圖1-1中的Tag是經(jīng)典標(biāo)記處理程序的接口,定義了標(biāo)記處理程序與 JSP 頁(yè)面實(shí)現(xiàn)類(lèi)之間的基本協(xié)議,也定義了生命周期以及在開(kāi)始和結(jié)束標(biāo)記時(shí)調(diào)用的方法。但是相對(duì)于其他標(biāo)簽處理接口來(lái)說(shuō)比較復(fù)雜,因此我們定義的標(biāo)簽處理類(lèi)不會(huì)去實(shí)現(xiàn)Tag接口,而是去實(shí)現(xiàn)SimpleTag接口,該接口的父接口是JspTag,它和Tag是兄弟關(guān)系。如圖1-2所示:
圖1-2 SimpleTag接口
SimpleTag是用來(lái)定義簡(jiǎn)單標(biāo)記處理程序的接口。簡(jiǎn)單標(biāo)記處理程序不同于經(jīng)典標(biāo)記處理程序,因?yàn)樗恢С?doStartTag() 和 doEndTag(),SimpleTag 接口提供了一個(gè)簡(jiǎn)單 doTag() 方法,對(duì)于任何給定標(biāo)記調(diào)用,只能調(diào)用該方法一次。所有標(biāo)記邏輯、迭代、正文求值等等,都在這一個(gè)方法中執(zhí)行。因此,簡(jiǎn)單標(biāo)記處理程序與 BodyTag 具有相等的效力,只是它具有更簡(jiǎn)單的生命周期和接口。
下面我們來(lái)了解SimpleTag接口的方法,如下所示:
l void doTag():每次執(zhí)行標(biāo)簽時(shí)都會(huì)調(diào)用這個(gè)方法;
l JspTag getParent():返回當(dāng)前標(biāo)簽的父標(biāo)簽;
l void setParent(JspTag parent):設(shè)置父標(biāo)簽;
l void setJspBody(JspFragment jspBody):設(shè)置標(biāo)簽體;
l void setJspContext(JspContext pc):設(shè)置jsp上下文對(duì)象,其中JspContext類(lèi)的子類(lèi)是PageContext。
以上這五個(gè)方法中,setParent(JspTag parent)、setJspBody(JspFragment jspBody)、setJspContext(JspContext pc)方法是由Tomcat服務(wù)器調(diào)用,服務(wù)器在調(diào)用setJspContext(JspContext pc)方法時(shí),會(huì)將頁(yè)面中的pageContext對(duì)象傳遞給該方法,那么我們就可以通過(guò)pageContext對(duì)象獲得其他內(nèi)置對(duì)象了。當(dāng)以上三個(gè)方法被調(diào)用后,doTag()方法才會(huì)被Tomcat服務(wù)器調(diào)用,而getParent()方法很少被調(diào)用,因?yàn)槲覀冏远x的標(biāo)簽很少會(huì)有父標(biāo)簽。需要注意的是我們自定義的標(biāo)簽是動(dòng)作標(biāo)簽,那么它的父標(biāo)簽也只能是動(dòng)作標(biāo)簽,因此HTML標(biāo)簽不算是自定義標(biāo)簽的父標(biāo)簽。
本文版權(quán)歸傳智播客Java培訓(xùn)學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明作者出處。謝謝!
作者:傳智播客Java培訓(xùn)學(xué)院
首發(fā):http://metathetuscanyresort.com/javaee