自定義標籤庫

實現自定義標籤按如下步驟進行:
(1)開發自定義標籤處理類;
(2)建立一個*.t1d 文件,每個*.t1d 文件對應一個標籤庫,每個標籤庫對應多個標籤;
(3)在web.xm1文件中增加自定義標籤的定義;
(4)在JSP 文件中使用自定義標籤。
一、開發自定義標籤處理類
自定義標籤類都必須繼承一個父類: java.Servlet.jsp.tagext.TagSupport 。除此之外,自定義標籤類還有如下要求。
·如果標籤類包含屬性,每個屬性都有對應的getter 和setter 方法。
·重寫doStartTag()或doEndTag()方法,這兩個方法生成頁面內容。
·如果需要在銷燬標籤之前完成資源回收,則重寫re1ease()方法。
下面提供了一個最簡單的標籤代碼:
import java.io.IOException;
import javax.servlet.jsp.JspTagException;
import javax.servlet.jsp.tagext.TagSupport;

//標籤處理類,繼承TagSupport 父類
public class HelloWorldTag extends TagSupport {
// 重寫doEndTag方法,該方法在標籤結束生成頁面內容
public int doEndTag() throws JspTagException {
try {
// 獲取頁面輸出流,並輸出字符串
pageContext.getOut().write("Hello World");
}
// 捕捉異常
catch (IOException ex) {
// 拋出新異常
throw new JspTagException("錯誤");
}
//返回值
return EVAL_PAGE;
}
}


這是個非常簡單的標籤,它只在頁面中生成一個"Hello World" 的字符串。該標籤沒有屬性,因此無須提供setter 和getter 方法;此外,該標籤無須初始化資源,因此無須重寫init 方法;在標籤結束時無須回收資源,因此無須重寫destroy 方法。

二、建立TLD 文件
<?xml version="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>
<!--定義標籤庫版本-->
<tlib-version>1.0</tlib-version>
<!--定義JSP 版本-->
<jsp-version>1.2</jsp-version>
<!--配置第一個標籤-->
<tag>
<!--配置標籤名-->
<name>helloworld</name>
<!--確定標籤的處理類-->
<tag-class>mytag.HelloWorldTag</tag-class>
<!--確定標籤的標籤體,標籤體爲空-->
<body-content>empty</body-content>
</tag>
</taglib>

這個標籤庫配置文件非常簡單,沒有標籤體及標籤屬性等。只是一個空標籤。

三、在web.xml 文件中增加標籤庫定義
在web.xml 文件中定義標籤庫時使用taglib 元素,該元素包含兩個子元素: taglib-uri
和taglib-location,前者確定標籤庫的URI; 後者確定標籤庫定義文件的位置。下面是web.xml 文件中關於test.tld 標籤庫的定義片段:
<!--定義標籤庫-->
<taglib>
<!--確定標籤庫的URI-->
<taglib-uri>/tags/tldtest.tld</taglib-uri>
<!--確定標籤庫定義文件的位置-->
<taglib-location>/WEB-INF/tldtest.tld</taglib-location>
</taglib>
如果需要使用多個標籤庫,只需要增加多個taglib 元素即可,因爲每個taglib 元素可對應一個標籤庫。

四、使用標籤庫
(1)導入標籤庫:使用taglib 編譯指令導入標籤。
(2)使用標籤:在JSP 頁面中使用自定義標籤。
taglib 的語法格式如下:
<%@ taglib uri= "tagliburi" prefix="tagPrefix" %>
其中uri 屬性確定標籤庫定義文件的URI,這個URI 就是在web.xml 文件中爲標籤庫定義的URI。而prefix 屬性確定的是標籤前綴,即在JSP 頁面中使用標籤時,該標籤庫負責處理的標籤前綴。
使用標籤的語法格式如下:
<tagPrefix : tagName tagAttribute=ntagValue n ...>
<tagBody/>
</tagPrefix>
如果該標籤沒有標籤體,則可以使用如下語法格式:
<tagPrefix : tagName tagAttribute=ntagValue n .../>

五、帶屬性的標籤
帶屬性的標籤必須爲每個屬性提供對應的setter 和getter 方法。其TLD配置如下:
<?xml version="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>
<!--定義標籤庫版本-->
<tlib-version>1.0</tlib-version>
<!--定義JSP 版本-->
<jsp-version>1.2</jsp-version>
<!--配置第一個標籤-->
<tag>
<!--配置標籤名-->
<name>query</name>
<!--確定標籤的處理類-->
<tag-class>mytag.QueryTag</tag-class>
<!--確定標籤的標籤體,標籤體爲空-->
<body-content>empty</body-content>
<!--配置標籤屬性: driver-->
<attribute>
<name>driver</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<!--配置標籤屬性: url -->
<attribute>
<name>url</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>


頁面中引用如下:
<%@ taglib uri="/tags/tldtest.tld" prefix="mytag" %>
<mytag:query driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/j2ee"/>


六、帶標籤體的標籤

帶標籤體的標籤,就是允許在標籤內嵌套標籤,通常可用於完成一些邏輯運算例如判斷和循環等。
帶標籤體的標籤需要繼承BodyTagSupport,該類包含一個bodyContent 屬性,該屬性代表標籤體。
BodyTagSupport 還包含兩個方法。
• doAfterBodyO: 每次處理完標籤體後調用該方法。
• void doInitBodyO: 開始調用標籤體時調用該方法。

在處理標籤類的各個方法中,不同的返回值對應不同的含義,常用的返回值有如下
幾個。
• SKIP_BODY: 不處理標籤體,直接調用doEndTag()方法。
• SKIP_PAGE: 忽略標籤後面的JSP 頁面。
• EVAL_PAGE: 處理標籤結束,直接處理頁面內容。
• EVAL_BODY_BUFFERED: 處理標籤體。
• EVAL_BODY_INCLUDE: 處理標籤體,但忽略setBodyContent()和doInitBody()方法。
• EVAL_BODY_AGAIN: 對標籤體循環處理。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章