jsp自定義標(biāo)簽
關(guān)鍵詞:
jsp自定義標(biāo)簽 ?? ??????????????????????????????????????
定義標(biāo)簽
要定義標(biāo)簽,需要:
·? 為該標(biāo)簽開發(fā)一個(gè)tag handler和helper類
·? 在標(biāo)簽庫描述符中聲明這個(gè)標(biāo)簽
本節(jié)描述標(biāo)簽handler和TLD的屬性,并解釋如何為在前面幾節(jié)中介紹的標(biāo)簽開發(fā)tag handler和庫描述符元素。
標(biāo)簽handler
標(biāo)簽handler是由Web容器調(diào)用的一個(gè)對(duì)象,用于執(zhí)行帶有自定義標(biāo)簽的JSP頁面時(shí)對(duì)這個(gè)標(biāo)簽進(jìn)行判斷。標(biāo)簽handler必須實(shí)現(xiàn)Tag或者BodyTag接口。接口可以用于接受現(xiàn)有Java對(duì)象并使它成為標(biāo)簽handler。對(duì)于新創(chuàng)建的處理器,可以用TagSupport和BodyTagSupport類作為基類。這些類和接口包含在javax.servlet.jsp.tagext包中。
JSP頁面的servlet在對(duì)標(biāo)簽處理的不同階段調(diào)用由Tag和BodyTag接口定義的標(biāo)簽handler。遇到自定義標(biāo)簽的開始標(biāo)簽時(shí),JSP頁面的servlet調(diào)用方法以初始化相應(yīng)的handler,然后調(diào)用handler的doStartTag方法。遇到自定義標(biāo)簽的結(jié)束標(biāo)簽時(shí),調(diào)用處理器的doEndTag方法。在標(biāo)簽handler需要與標(biāo)簽的正文交互時(shí)調(diào)用其他方法,見帶正文的標(biāo)簽。為了提供標(biāo)簽handler的實(shí)現(xiàn),必須實(shí)現(xiàn)在處理標(biāo)簽的不同階段調(diào)用的方法,在表16-1中匯總了這些方法。
表16-1標(biāo)簽handler方法 |
標(biāo)簽handler類型 | 方法 |
簡單 | doStartTag, doEndTag, release |
屬性 | doStartTag, doEndTag, set/getAttribute1...N, release |
正文、判斷且無交互 | doStartTag, doEndTag, release |
正文、迭代判斷 | doStartTag, doAfterBody, doEndTag, release |
正文、交互 | doStartTag, doEndTag, release, doInitBody, doAfterBody, release |
標(biāo)簽handler可以使用一個(gè)能讓它得以與JSP頁面通信的API。到API的入口點(diǎn)是頁面上下文對(duì)象(javax.servlet.jsp.PageContext),通過它標(biāo)簽handler可以獲取JSP頁面能夠訪問的所有其他隱式對(duì)象(請(qǐng)求、會(huì)話和應(yīng)用程序)。
隱式對(duì)象可以有與其相關(guān)聯(lián)的命名屬性。可以用[set|get]Attribute方法訪問這種屬性。
如果標(biāo)簽是嵌入的,標(biāo)簽handler還可以訪問與外圍標(biāo)簽關(guān)聯(lián)的handler稱為parent)。
一組相關(guān)的標(biāo)簽handler類(標(biāo)簽庫)一般是打包的且作為JAR文檔部署。
標(biāo)簽庫描述符
標(biāo)簽庫描述符(TLD)是一個(gè)描述標(biāo)簽庫的XML文檔。TLD包含有關(guān)整個(gè)庫以及庫中包含的每一個(gè)標(biāo)簽的信息。Web容器用TLD驗(yàn)證標(biāo)簽,JSP頁面開發(fā)工具也使用TLD。
TLD文件名必須有擴(kuò)展名.tld。TLD文件也儲(chǔ)存在WAR文件的WEB-INF目錄中或者在WEB-INF的子目錄中。
TLD必須以指定XML的版本和文檔類型定義(DTD)的XML文檔序言(prolog)開始。
<?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
Tomcat支持版本 1.1和1.2的DTD。不過,本章所討論的是1.2版本,因?yàn)樵陂_發(fā)的所有標(biāo)簽庫中都應(yīng)該使用最新的版本。模板庫TLDtutorial-template.tld符合版本1.2。Struts庫TLD符合版本1.1的DTD,它的元素要少,且其中一些元素使用了稍微不同的名字。
TLD的根是taglib元素。表16-2中列出了taglib的子元素:
表16-2 taglib子子元素? |
元素 | 說明 |
tlib-version | 標(biāo)簽庫的版本 |
jsp-version | 這個(gè)標(biāo)簽庫要求的JSP規(guī)范版本 |
short-name | JSP頁面編寫工具可以用來創(chuàng)建助記名的可選名字 |
uri | 唯一標(biāo)識(shí)該標(biāo)簽庫的的URI |
display-name | 將由工具顯示的可選名 |
small-icon | 將由工具使用的可選小圖標(biāo) |
large-icon | 可被工具使用的可選大圖標(biāo) |
description | 可選的標(biāo)簽特定信息 |
listener | 見listener元素 |
tag | 見tag元素 |
?
listener元素
標(biāo)簽庫可以指定一些事件監(jiān)聽器類(見處理Servlet生命周期事件)。這些監(jiān)聽器在TLD中作為listener元素列出,Web容器將初始化監(jiān)聽器類并以類似在WAR級(jí)定義的監(jiān)聽器的方式注冊(cè)它們。與WAR級(jí)監(jiān)聽器不同,這里沒有指定標(biāo)簽庫監(jiān)聽器注冊(cè)的順序。listener元素的唯一子元素是listener-class元素,它必須包含監(jiān)聽類的完全限定名。
tag元素
庫中的每一個(gè)標(biāo)簽都由給出其名字和其標(biāo)簽handler的類、在由標(biāo)簽創(chuàng)建的腳本變量上的信息以及標(biāo)簽屬性上的信息描述。腳本變量信息可以在TLD中直接給出,也可以通過tag extra info類給出(見定義腳本變量的標(biāo)簽)。每一個(gè)屬性聲明包含指明屬性是否是必需的、其值是否可以由請(qǐng)求時(shí)表達(dá)式確定以及屬性類型的內(nèi)容(見屬性元素)。
在tag元素中的TLD中指定標(biāo)簽。在表16-3中出了tag的子元素:
表16-3 標(biāo)簽子元素 |
元素 | 說明 |
name | 唯一標(biāo)簽名 |
tag-class | 標(biāo)簽handler類的完全限定名 |
tei-class | javax.servlet.jsp.tagext.TagExtraInfo的可選子類。見提供有關(guān)腳本變量的信息。 |
body-content | 正文內(nèi)容類型。見body-conten元素和 body-content元素。 |
display-name | 由工具顯示的可選名 |
small-icon | 可以由工具使用的小圖標(biāo) |
large-icon | 可以由工具使用的大圖標(biāo) |
description | 可選的標(biāo)簽特定的信息 |
variable | 可選的腳本變量信息。見提供有關(guān)腳本變量的信息。 |
attribute | 標(biāo)簽屬性信息。見Attribute 元素。 |
下面幾節(jié)描述開發(fā)在標(biāo)簽類型中介紹的每一種類型的標(biāo)簽所需要的方法和TLD。
簡單標(biāo)簽
標(biāo)簽handler
簡單標(biāo)簽的handler必須實(shí)現(xiàn)Tag接口的doStartTag和doEndTag方法。在遇到開始標(biāo)簽時(shí)調(diào)用doStartTag方法。因?yàn)楹唵螛?biāo)簽沒有正文,所以這個(gè)方法返回SKIP_BODY。在遇到結(jié)束標(biāo)簽時(shí)調(diào)用doEndTag方法。如果要對(duì)頁面的其他部分進(jìn)行判斷,則doEndTag方法需要返回EVAL_PAGE,否則,它就返回SKIP_PAGE。
在第一節(jié)討論的簡單標(biāo)簽
<tt:simple />
由下列標(biāo)簽handler實(shí)現(xiàn):
public SimpleTag extends TagSupport {
??public int doStartTag() throws JspException {
????try { ??????pageContext.getOut().print("Hello.");
????} catch (Exception ex) {
??????throw new JspTagException("SimpleTag: " +
????????ex.getMessage()); ????}
????return SKIP_BODY; ??}
??public int doEndTag() {
????return EVAL_PAGE;
??}
}
body-content元素
沒有正文的標(biāo)簽必須用body-content元素聲明它們的正文內(nèi)容是空的:
<body-content>empty</body-content>