jsp自定義標簽
關鍵詞:
jsp自定義標簽 ?? ??????????????????????????????????????
定義標簽
要定義標簽,需要:
·? 為該標簽開發一個tag handler和helper類
·? 在標簽庫描述符中聲明這個標簽
本節描述標簽handler和TLD的屬性,并解釋如何為在前面幾節中介紹的標簽開發tag handler和庫描述符元素。
標簽handler
標簽handler是由Web容器調用的一個對象,用于執行帶有自定義標簽的JSP頁面時對這個標簽進行判斷。標簽handler必須實現Tag或者BodyTag接口。接口可以用于接受現有Java對象并使它成為標簽handler。對于新創建的處理器,可以用TagSupport和BodyTagSupport類作為基類。這些類和接口包含在javax.servlet.jsp.tagext包中。
JSP頁面的servlet在對標簽處理的不同階段調用由Tag和BodyTag接口定義的標簽handler。遇到自定義標簽的開始標簽時,JSP頁面的servlet調用方法以初始化相應的handler,然后調用handler的doStartTag方法。遇到自定義標簽的結束標簽時,調用處理器的doEndTag方法。在標簽handler需要與標簽的正文交互時調用其他方法,見帶正文的標簽。為了提供標簽handler的實現,必須實現在處理標簽的不同階段調用的方法,在表16-1中匯總了這些方法。
表16-1標簽handler方法 |
標簽handler類型 | 方法 |
簡單 | doStartTag, doEndTag, release |
屬性 | doStartTag, doEndTag, set/getAttribute1...N, release |
正文、判斷且無交互 | doStartTag, doEndTag, release |
正文、迭代判斷 | doStartTag, doAfterBody, doEndTag, release |
正文、交互 | doStartTag, doEndTag, release, doInitBody, doAfterBody, release |
標簽handler可以使用一個能讓它得以與JSP頁面通信的API。到API的入口點是頁面上下文對象(javax.servlet.jsp.PageContext),通過它標簽handler可以獲取JSP頁面能夠訪問的所有其他隱式對象(請求、會話和應用程序)。
隱式對象可以有與其相關聯的命名屬性。可以用[set|get]Attribute方法訪問這種屬性。
如果標簽是嵌入的,標簽handler還可以訪問與外圍標簽關聯的handler稱為parent)。
一組相關的標簽handler類(標簽庫)一般是打包的且作為JAR文檔部署。
標簽庫描述符
標簽庫描述符(TLD)是一個描述標簽庫的XML文檔。TLD包含有關整個庫以及庫中包含的每一個標簽的信息。Web容器用TLD驗證標簽,JSP頁面開發工具也使用TLD。
TLD文件名必須有擴展名.tld。TLD文件也儲存在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版本,因為在開發的所有標簽庫中都應該使用最新的版本。模板庫TLDtutorial-template.tld符合版本1.2。Struts庫TLD符合版本1.1的DTD,它的元素要少,且其中一些元素使用了稍微不同的名字。
TLD的根是taglib元素。表16-2中列出了taglib的子元素:
表16-2 taglib子子元素? |
元素 | 說明 |
tlib-version | 標簽庫的版本 |
jsp-version | 這個標簽庫要求的JSP規范版本 |
short-name | JSP頁面編寫工具可以用來創建助記名的可選名字 |
uri | 唯一標識該標簽庫的的URI |
display-name | 將由工具顯示的可選名 |
small-icon | 將由工具使用的可選小圖標 |
large-icon | 可被工具使用的可選大圖標 |
description | 可選的標簽特定信息 |
listener | 見listener元素 |
tag | 見tag元素 |
?
listener元素
標簽庫可以指定一些事件監聽器類(見處理Servlet生命周期事件)。這些監聽器在TLD中作為listener元素列出,Web容器將初始化監聽器類并以類似在WAR級定義的監聽器的方式注冊它們。與WAR級監聽器不同,這里沒有指定標簽庫監聽器注冊的順序。listener元素的唯一子元素是listener-class元素,它必須包含監聽類的完全限定名。
tag元素
庫中的每一個標簽都由給出其名字和其標簽handler的類、在由標簽創建的腳本變量上的信息以及標簽屬性上的信息描述。腳本變量信息可以在TLD中直接給出,也可以通過tag extra info類給出(見定義腳本變量的標簽)。每一個屬性聲明包含指明屬性是否是必需的、其值是否可以由請求時表達式確定以及屬性類型的內容(見屬性元素)。
在tag元素中的TLD中指定標簽。在表16-3中出了tag的子元素:
表16-3 標簽子元素 |
元素 | 說明 |
name | 唯一標簽名 |
tag-class | 標簽handler類的完全限定名 |
tei-class | javax.servlet.jsp.tagext.TagExtraInfo的可選子類。見提供有關腳本變量的信息。 |
body-content | 正文內容類型。見body-conten元素和 body-content元素。 |
display-name | 由工具顯示的可選名 |
small-icon | 可以由工具使用的小圖標 |
large-icon | 可以由工具使用的大圖標 |
description | 可選的標簽特定的信息 |
variable | 可選的腳本變量信息。見提供有關腳本變量的信息。 |
attribute | 標簽屬性信息。見Attribute 元素。 |
下面幾節描述開發在標簽類型中介紹的每一種類型的標簽所需要的方法和TLD。
簡單標簽
標簽handler
簡單標簽的handler必須實現Tag接口的doStartTag和doEndTag方法。在遇到開始標簽時調用doStartTag方法。因為簡單標簽沒有正文,所以這個方法返回SKIP_BODY。在遇到結束標簽時調用doEndTag方法。如果要對頁面的其他部分進行判斷,則doEndTag方法需要返回EVAL_PAGE,否則,它就返回SKIP_PAGE。
在第一節討論的簡單標簽
<tt:simple />
由下列標簽handler實現:
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元素
沒有正文的標簽必須用body-content元素聲明它們的正文內容是空的:
<body-content>empty</body-content>