自定義標簽開發整理
從jsp1.1開始就可以在jsp頁面中使用自定義標簽了,使用自定義標簽不但可以實現代碼重用,而且可以使jsp代碼更簡潔。Jsp2.0的標簽擴展API中又增加了SimpleTag接口和其實現類SimpleTagSupport。
標簽擴展API層次結構:
TLD文件元素詳解:
每個自定義標簽都必須在TLD文件中聲明,TLD文件只不過是一個XML文件。根元素是<taglib>,它包含一個或者多個<tag>標簽,該元素用來聲明定制標簽。<taglib>元素中只有<tlib-version>元素是必須的,其他都是可選的。
TLD文件中的元素
標 簽 |
含 義 |
<taglib> |
TLD文件的根元素 |
<tlib-version> |
此標簽庫的版本 |
<jsp-version> |
此標簽庫依賴的JSP版本。 |
<short-name>
<description> <display-name> <icon> <uri> <validator> <listener> <function> |
當在JSP中使用標簽時,此標簽庫首選或者建議的前綴。當然可以完全忽略這個建議 描述信息 圖形工具可顯示的一個簡短名稱 圖形工具可顯示的圖標 指定使用該標簽庫中標簽的URI 關於該庫的TagLibraryValidator信息 指定事件監聽器類 定義一個在EL中使用的函數 |
<tag> |
定義一個標簽 |
<tag>元素的子元素
標 簽 |
含 義 |
<description> <display-name> <icon> <name> |
指定針對標簽的信息 開發工具用於顯示的一個簡短名稱 可被開發工具使用的圖標 標簽名稱 |
<tag-class>
<tei-class> |
Java標簽處理器類的名稱。注意這是處理器類的全限定名稱,比如com.xx.tag.TableTag Javax.servlet.jsp.tagext.TagExtraInfo類的一個可選子類 |
<body-content>
<variable> <example> |
此標簽的主體部分的內容。其值可為scriptless\tagdependent\empty,默認為empty 定義腳本變量信息 使用該標簽例子的可選的非正式描述 |
<attribute> |
包含了此標簽的一個屬性的元數據 |
<attribute>的子元素
標 簽 |
含 義 |
<description> <name> |
有關描述的文本信息 在jsp標簽中使用的屬性名稱 |
<required>
<rtexprvalue>
<type> |
指定屬性是必須的還是可選的,默認為false,表示屬性可選。如果該值為true,則jsp頁面必須為該屬性提供一個值。可能的值true、false、yes、no 指定屬性是否能接受請求時表達式的值,默認為false,表示不能接受請求時表達式的值。可能值:true、false、yes、no 屬性的數據類型,該元素只能用在當<rtexprvalue>設置為true時。它指定當使用請求時屬性表達式(<%= %>)返回類型。默認string |
實例(繼承SimpleTagSupport類方式):
編寫一個DateTag標簽,輸出系統時間。<c1:date/>,輸出的格式:2011年11月9日
step1: 寫一個java類,繼承SimpleTagSupport類
step2: override doTag()方法,在該方法里,實現相應的處理邏輯
1 package mytag; 2 import java.io.IOException; 3 import java.text.SimpleDateFormat; 4 import java.util.Date; 5 import javax.servlet.jsp.JspException; 6 import javax.servlet.jsp.JspWriter; 7 import javax.servlet.jsp.PageContext; 8 import javax.servlet.jsp.tagext.SimpleTagSupport; 9 10 public class DateTag extends SimpleTagSupport{ 11 @Override 12 public void doTag() throws JspException, IOException { 13 PageContext ctx = (PageContext)getJspContext(); 14 JspWriter out = ctx.getOut(); 15 SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日"); 16 out.println(sdf.format(new Date())); 17 } 18 }
step3: 在.tld文件當中,描述該標簽
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <taglib xmlns="http://java.sun.com/xml/ns/j2ee" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" 5 version="2.0"> 6 <tlib-version>1.1</tlib-version> 7 <short-name>c1</short-name> 8 <uri>http://www.tarena.com.cn/mytag1</uri> 9 <tag> 10 <name>date</name> 11 <tag-class>mytag.DateTag</tag-class> 12 <body-content>empty</body-content> 13 </tag> 14 </taglib>
step4: 使用taglib導入標簽(jsp中)
1 <%@taglib prefix="c1" uri="http://www.tarena.com.cn/mytag1" %> 2 <c1:date/>