|
8.建立标簽庫描述檔案
标簽庫描述檔案(Tag Library Discriptor,TLD)是一份标準的XML檔案,用來記錄一個标簽庫内擁有哪些标簽?每個标簽包含哪些屬性?取得這些資訊後,JSP容器才能正确地處理并運作JSP所包含的自定義标簽。以下是一個JSP2.0規範的TLD:
weclome.tld
<?xml version="1.0" encoding="UTF-8"?>
<!-- 标簽庫描述符 -->
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
<!-- 此标簽庫的一個描述 -->
<description>A tag library exercising SimpleTag handlers.</description>
<!-- 此标簽庫的版本,由程式設計師自行決定(必須) -->
<tlib-version>1.0</tlib-version>
<!-- 定義一個簡短的名稱(必須)主要由工具使用 -->
<short-name>SimpleTagLibrary</short-name>
<!-- 定義該标簽庫的唯一uri名(在taglib指令中使用) -->
<uri>/SimpleTagLibrary</uri>
<tag><!-- 定義每個标簽的特性 -->
<description>body content to Upper</description><!-- 描述 -->
<name>simpletag</name> <!-- 自定義标簽的名稱 -->
<tag-class>xmh.comchapter11.Welcome</tag-class> <!-- 此标簽對應的處理類 -->
<body-content>scriptless</body-content><!-- 定義标簽主體的種類:指定标簽的格式,empty表示标簽沒有标簽主體;JSP表示标簽的标簽體中可以包含JSP代碼;scriptless表示标簽主體中可以包含EL表達式和JSP的動作元素,但不能包含JSP的腳本元素;tagdependent表示标簽的标簽主體交由标簽本身去解析處理。如果指定為它,那麼你在标簽體中所寫的任何代碼都會原封不動地傳給标簽處理器,而不是傳遞執行的結果。 -->
<attribute>
<name>attrName</name> <!-- 此屬性的名稱 -->
<required>false</required> <!-- 此屬性是否為必要:true | false -->
<rtexprvalue>true</rtexprvalue><!-- 屬性值是否可以在JSP運作時期動态産生:true | false -->
</attribute>
</tag>
</taglib>
9.在web.xml檔案中聲明TLD的位置
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4">
......
<jsp-config>
<taglib>
<!-- 指定TLD檔案所對應的URI -->
<taglib-uri>/mytag</taglib-uri>
<!-- 指定TLD檔案的存放路徑 -->
<taglib-location>/WEB-INF/tlds/weclome.tld</taglib-location>
</taglib>
</jsp-config>
</web-app>
注意在JSP2.0規範中可以不用聲明TLD的位置,因為容器開始建立<uri>和TLD映射時,會首先在web.xml中查找,看是否有<taglib>項,如果确實有,就會使用這些設定來幫助建立映射。否則會在WEB-INF目錄以及它的tlds子目錄(還可以是jar檔案中)下查找TLD檔案,然後自動建立TLD檔案和<uri>名之間的映射關系。
10.在JSP檔案中用taglib指令引入标簽庫
<%@ taglib uri="/mytag" prefix="my" %>
11.在JSP中使用标簽庫标簽
<my:simpletag>Hello,World!</my:simpletag>
12.自定義JSP标簽的處理過程
<!--[if !supportLists]-->(1)在JSP中引入标簽庫:<% @ taglib prefix="taglibprefix" uri="tagliburi" %>。
<!--[if !supportLists]-->(2)在JSP中使用标簽庫标簽:<prefix : tagname attribute="tagattribute">。
<!--[if !supportLists]-->(3)Web容器根據第二個步驟中的prefix,獲得第一個步驟中聲明的taglib的uri屬性值。
<!--[if !supportLists]-->(4)Web容器根據uri屬性在web.xml找到對應的<taglib>元素。
<!--[if !supportLists]-->(5)從<taglib>元素中獲得對應的<taglib-location>元素的值。
<!--[if !supportLists]-->(6)Web容器根據<taglib-location>元素的值從WEB-INF/目錄下找到對應的.tld檔案。
<!--[if !supportLists]-->(7)從.tld檔案中找到與tagname對應的<tag>元素。
<!--[if !supportLists]--><!--[endif]-->(8)從<tag>元素中獲得對應的<tag-class>元素的值。
<!--[if !supportLists]-->(9)Web容器根據<tag-class>元素的值建立相應的标簽處理類的執行個體。
<!--[if !supportLists]-->(10)Web容器調用這個執行個體的doStartTag/doAfterBody/doEndTag方法完成相應的處理。