從jsp1.1開始就可以在jsp頁面中使用自定義標籤了,使用自定義標籤不但可以實現代碼重用,而且可以使jsp代碼更簡潔。Jsp2.0的標籤擴展API中又增加了SimpleTag接口和其實現類SimpleTagSupport。
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 |
下面舉例詳解。
<description>;我在test.jsp 頁面寫了 <ex:hello /> 後,我把鼠標放在該標籤上時提示 description中的內容。
<xsd:enumeration value="tagdependent"/> <xsd:enumeration value="JSP"/> <xsd:enumeration value="empty"/> <xsd:enumeration value="scriptless"/> |
tagdependent:標籤體內容直接被寫入BodyContent,由自定義標籤類來進行處理,而不被JSP容器解釋,
如下:
<test:myList>
select name,age from users
</test:myList>
JSP:接受所有JSP語法,如定製的或內部的tag、scripts、靜態HTML、腳本元素、JSP指令和動作。如: 這種很好理解
<my:test>
<%=request.getProtocol()%> // ②
</my:test>
具體可參考後面附源碼。
empty:空標記,即起始標記和結束標記之間沒有內容。 這種很好理解
下面幾種寫法都是有效的,
<test:mytag />
<test:mytag uname="Tom" />
<test:mytag></test:mytag>
scriptless:接受文本、EL和JSP動作。如上述②使用<body-content> scriptless </body-content>則報錯,具體可參考後面附源碼。
標籤擴展API層次結構: