實(shí)現(xiàn)自定義標(biāo)簽按如下步驟進(jìn)行:
(1)開發(fā)自定義標(biāo)簽處理類;
(2)建立一個*.tld 文件,每個*.tld 文件對應(yīng)一個標(biāo)簽庫,每個標(biāo)簽庫對應(yīng)多個標(biāo)簽;
(3)在web.xml文件中增加自定義標(biāo)簽的定義;
(4)在JSP 文件中使用自定義標(biāo)簽。
一、開發(fā)自定義標(biāo)簽處理類
自定義標(biāo)簽類都必須繼承一個父類: java.Servlet.jsp.tagext.TagSupport 。除此之外,自定義標(biāo)簽類還有如下要求。
·如果標(biāo)簽類包含屬性,每個屬性都有對應(yīng)的getter 和setter 方法。
·重寫doStartTag()或doEndTag()方法,這兩個方法生成頁面內(nèi)容。
·如果需要在銷毀標(biāo)簽之前完成資源回收,則重寫re1ease()方法。
下面提供了一個最簡單的標(biāo)簽代碼:
這是個非常簡單的標(biāo)簽,它只在頁面中生成一個"Hello World" 的字符串。該標(biāo)簽沒有屬性,因此無須提供setter 和getter 方法;此外,該標(biāo)簽無須初始化資源,因此無須重寫init 方法;在標(biāo)簽結(jié)束時無須回收資源,因此無須重寫destroy 方法。
二、建立TLD 文件
這個標(biāo)簽庫配置文件非常簡單,沒有標(biāo)簽體及標(biāo)簽屬性等。只是一個空標(biāo)簽。
三、在web.xml 文件中增加標(biāo)簽庫定義
在web.xml 文件中定義標(biāo)簽庫時使用taglib 元素,該元素包含兩個子元素: taglib-uri
和taglib-location,前者確定標(biāo)簽庫的URI; 后者確定標(biāo)簽庫定義文件的位置。下面是web.xml 文件中關(guān)于test.tld 標(biāo)簽庫的定義片段:
如果需要使用多個標(biāo)簽庫,只需要增加多個taglib 元素即可,因?yàn)槊總€taglib 元素可對應(yīng)一個標(biāo)簽庫。
四、使用標(biāo)簽庫
(1)導(dǎo)入標(biāo)簽庫:使用taglib 編譯指令導(dǎo)入標(biāo)簽。
(2)使用標(biāo)簽:在JSP 頁面中使用自定義標(biāo)簽。
taglib 的語法格式如下:
其中uri 屬性確定標(biāo)簽庫定義文件的URI,這個URI 就是在web.xml 文件中為標(biāo)簽庫定義的URI。而prefix 屬性確定的是標(biāo)簽前綴,即在JSP 頁面中使用標(biāo)簽時,該標(biāo)簽庫負(fù)責(zé)處理的標(biāo)簽前綴。
使用標(biāo)簽的語法格式如下:
<tagPrefix : tagName tagAttribute=ntagValue n ...>
<tagBody/>
</tagPrefix>
如果該標(biāo)簽沒有標(biāo)簽體,則可以使用如下語法格式:
<tagPrefix : tagName tagAttribute=ntagValue n .../>
五、帶屬性的標(biāo)簽
帶屬性的標(biāo)簽必須為每個屬性提供對應(yīng)的setter 和getter 方法。其TLD配置如下:
頁面中引用如下:
六、帶標(biāo)簽體的標(biāo)簽
帶標(biāo)簽體的標(biāo)簽,就是允許在標(biāo)簽內(nèi)嵌套標(biāo)簽,通??捎糜谕瓿梢恍┻壿嬤\(yùn)算例如判斷和循環(huán)等。
帶標(biāo)簽體的標(biāo)簽需要繼承BodyTagSupport,該類包含一個bodyContent 屬性,該屬性代表標(biāo)簽體。
BodyTagSupport 還包含兩個方法。
• doAfterBodyO: 每次處理完標(biāo)簽體后調(diào)用該方法。
• void doInitBodyO: 開始調(diào)用標(biāo)簽體時調(diào)用該方法。
在處理標(biāo)簽類的各個方法中,不同的返回值對應(yīng)不同的含義,常用的返回值有如下
幾個。
• SKIP_BODY: 不處理標(biāo)簽體,直接調(diào)用doEndTag()方法。
• SKIP_PAGE: 忽略標(biāo)簽后面的JSP 頁面。
• EVAL_PAGE: 處理標(biāo)簽結(jié)束,直接處理頁面內(nèi)容。
• EVAL_BODY_BUFFERED: 處理標(biāo)簽體。
• EVAL_BODY_INCLUDE: 處理標(biāo)簽體,但忽略setBodyContent()和doInitBody()方法。
• EVAL_BODY_AGAIN: 對標(biāo)簽體循環(huán)處理。
(1)開發(fā)自定義標(biāo)簽處理類;
(2)建立一個*.tld 文件,每個*.tld 文件對應(yīng)一個標(biāo)簽庫,每個標(biāo)簽庫對應(yīng)多個標(biāo)簽;
(3)在web.xml文件中增加自定義標(biāo)簽的定義;
(4)在JSP 文件中使用自定義標(biāo)簽。
一、開發(fā)自定義標(biāo)簽處理類
自定義標(biāo)簽類都必須繼承一個父類: java.Servlet.jsp.tagext.TagSupport 。除此之外,自定義標(biāo)簽類還有如下要求。
·如果標(biāo)簽類包含屬性,每個屬性都有對應(yīng)的getter 和setter 方法。
·重寫doStartTag()或doEndTag()方法,這兩個方法生成頁面內(nèi)容。
·如果需要在銷毀標(biāo)簽之前完成資源回收,則重寫re1ease()方法。
下面提供了一個最簡單的標(biāo)簽代碼:
Java代碼
- import java.io.IOException;
- import javax.servlet.jsp.JspTagException;
- import javax.servlet.jsp.tagext.TagSupport;
- //標(biāo)簽處理類,繼承TagSupport 父類
- publicclass HelloWorldTag extends TagSupport {
- // 重寫doEndTag方法,該方法在標(biāo)簽結(jié)束生成頁面內(nèi)容
- publicint doEndTag() throws JspTagException {
- try {
- // 獲取頁面輸出流,并輸出字符串
- pageContext.getOut().write("Hello World");
- }
- // 捕捉異常
- catch (IOException ex) {
- // 拋出新異常
- thrownew JspTagException("錯誤");
- }
- //返回值
- return EVAL_PAGE;
- }
- }
這是個非常簡單的標(biāo)簽,它只在頁面中生成一個"Hello World" 的字符串。該標(biāo)簽沒有屬性,因此無須提供setter 和getter 方法;此外,該標(biāo)簽無須初始化資源,因此無須重寫init 方法;在標(biāo)簽結(jié)束時無須回收資源,因此無須重寫destroy 方法。
二、建立TLD 文件
Xml代碼
- <?xmlversion="I.O"encoding="ISO-8859-1"?>
- <!DOCTYPE taglib PUBLIC "-//Sun Microsystems,Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_l_2.dtd">
- <taglib>
- <!--定義標(biāo)簽庫版本-->
- <tlib-version>1.0</tlib-version>
- <!--定義JSP 版本-->
- <jsp-version>1.2</jsp-version>
- <!--配置第一個標(biāo)簽-->
- <tag>
- <!--配置標(biāo)簽名-->
- <name>helloworld</name>
- <!--確定標(biāo)簽的處理類-->
- <tag-class>mytag.HelloWorldTag</tag-class>
- <!--確定標(biāo)簽的標(biāo)簽體,標(biāo)簽體為空-->
- <body-content>empty</body-content>
- </tag>
- </taglib>
這個標(biāo)簽庫配置文件非常簡單,沒有標(biāo)簽體及標(biāo)簽屬性等。只是一個空標(biāo)簽。
三、在web.xml 文件中增加標(biāo)簽庫定義
在web.xml 文件中定義標(biāo)簽庫時使用taglib 元素,該元素包含兩個子元素: taglib-uri
和taglib-location,前者確定標(biāo)簽庫的URI; 后者確定標(biāo)簽庫定義文件的位置。下面是web.xml 文件中關(guān)于test.tld 標(biāo)簽庫的定義片段:
Xml代碼
- <!--定義標(biāo)簽庫-->
- <taglib>
- <!--確定標(biāo)簽庫的URI-->
- <taglib-uri>/tags/tldtest.tld</taglib-uri>
- <!--確定標(biāo)簽庫定義文件的位置-->
- <taglib-location>/WEB-INF/tldtest.tld</taglib-location>
- </taglib>
四、使用標(biāo)簽庫
(1)導(dǎo)入標(biāo)簽庫:使用taglib 編譯指令導(dǎo)入標(biāo)簽。
(2)使用標(biāo)簽:在JSP 頁面中使用自定義標(biāo)簽。
taglib 的語法格式如下:
Jsp代碼
- <%@ taglib uri= "tagliburi" prefix="tagPrefix" %>
使用標(biāo)簽的語法格式如下:
<tagPrefix : tagName tagAttribute=ntagValue n ...>
<tagBody/>
</tagPrefix>
如果該標(biāo)簽沒有標(biāo)簽體,則可以使用如下語法格式:
<tagPrefix : tagName tagAttribute=ntagValue n .../>
五、帶屬性的標(biāo)簽
帶屬性的標(biāo)簽必須為每個屬性提供對應(yīng)的setter 和getter 方法。其TLD配置如下:
Xml代碼
- <?xmlversion="I.O"encoding="ISO-8859-1"?>
- <!DOCTYPE taglib PUBLIC "-//Sun Microsystems,Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_l_2.dtd">
- <taglib>
- <!--定義標(biāo)簽庫版本-->
- <tlib-version>1.0</tlib-version>
- <!--定義JSP 版本-->
- <jsp-version>1.2</jsp-version>
- <!--配置第一個標(biāo)簽-->
- <tag>
- <!--配置標(biāo)簽名-->
- <name>query</name>
- <!--確定標(biāo)簽的處理類-->
- <tag-class>mytag.QueryTag</tag-class>
- <!--確定標(biāo)簽的標(biāo)簽體,標(biāo)簽體為空-->
- <body-content>empty</body-content>
- <!--配置標(biāo)簽屬性: driver-->
- <attribute>
- <name>driver</name>
- <required>true</required>
- <rtexprvalue>true</rtexprvalue>
- </attribute>
- <!--配置標(biāo)簽屬性: url -->
- <attribute>
- <name>url</name>
- <required>true</required>
- <rtexprvalue>true</rtexprvalue>
- </attribute>
- </tag>
- </taglib>
頁面中引用如下:
Jsp代碼
- <%@ taglib uri="/tags/tldtest.tld" prefix="mytag" %>
- <mytag:query driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/j2ee"/>
六、帶標(biāo)簽體的標(biāo)簽
帶標(biāo)簽體的標(biāo)簽,就是允許在標(biāo)簽內(nèi)嵌套標(biāo)簽,通??捎糜谕瓿梢恍┻壿嬤\(yùn)算例如判斷和循環(huán)等。
帶標(biāo)簽體的標(biāo)簽需要繼承BodyTagSupport,該類包含一個bodyContent 屬性,該屬性代表標(biāo)簽體。
BodyTagSupport 還包含兩個方法。
• doAfterBodyO: 每次處理完標(biāo)簽體后調(diào)用該方法。
• void doInitBodyO: 開始調(diào)用標(biāo)簽體時調(diào)用該方法。
在處理標(biāo)簽類的各個方法中,不同的返回值對應(yīng)不同的含義,常用的返回值有如下
幾個。
• SKIP_BODY: 不處理標(biāo)簽體,直接調(diào)用doEndTag()方法。
• SKIP_PAGE: 忽略標(biāo)簽后面的JSP 頁面。
• EVAL_PAGE: 處理標(biāo)簽結(jié)束,直接處理頁面內(nèi)容。
• EVAL_BODY_BUFFERED: 處理標(biāo)簽體。
• EVAL_BODY_INCLUDE: 處理標(biāo)簽體,但忽略setBodyContent()和doInitBody()方法。
• EVAL_BODY_AGAIN: 對標(biāo)簽體循環(huán)處理。