1. 自訂JSP標籤概述
自訂JSP標籤就是程式員定義的一種JSP標籤,這種標籤把那些資訊顯示邏輯封裝在一個單獨的Java類中,通過一個XML檔案來描述它的使用。當頁面中需要使用類似的顯示邏輯時,就可以在頁面中插入這個標籤,從而完成相應的功能。使用自訂標籤,可以分離程式邏輯和表示邏輯,將Java代碼從HTML中剝離,便於美工維護頁面;自訂標籤也提供了可重用的功能組件,能夠提高工程的開發效率。
自訂標籤主要用於移除Jsp頁面中的java代碼。
2. 自訂JSP標籤的執行過程
當一個含有自訂標籤的JSP頁面被JSP引擎(Web容器)轉譯成Servlet時,JSP引擎遇到自訂的標籤,會把這個自訂標籤轉化成對一個稱為“標籤處理類”的調用。之後,當這個JSP頁面被執行時,JSP引擎就會調用這個“標籤處理類”對象,並執行其內部定義的相應操作方法,從而完成相應的功能。
自訂JSP標籤的開發流程
使用Java處理類來開發自訂JSP標籤時,主要分為下幾個步驟。
– 建立標籤的處理類(Tag Handle Class)。這個類實現Tag介面,用來定義標籤的行為,並在JSP引擎遇到自訂標籤時調用執行。
– 建立標籤庫描述 (tld) 檔案(Tag Library Descriptor File),在tld檔案中對標籤處理器類進行描述。
– 在JSP檔案中用taglib指令引入標籤庫,然後使用標籤庫描述檔案中指定的標籤名來使用它。
3. Tag介面的執行流程
JSP引擎將遇到自訂標籤時,首先建立標籤處理器類的執行個體對象,然後按照JSP規範定義的通訊規則依次調用它的方法。
1)、public void setPageContext(PageContext pc), JSP引擎執行個體化標籤處理器後,將調用setPageContext方法將JSP頁面的pageContext對象傳遞給標籤處理器,標籤處理器以後可以通過這個pageContext對象與JSP頁面進行通訊。
2)、public void setParent(Tag t),setPageContext方法執行完後,WEB容器接著調用的setParent方法將當前標籤的父標籤傳遞給當前標籤處理器,如果當前標籤沒有父標籤,則傳遞給setParent方法的參數值為null。
3)、public int doStartTag(),調用了setPageContext方法和setParent方法之後,WEB容器執行到自訂標籤的開始標記時,就會調用標籤處理器的doStartTag方法。
4)、public int doEndTag(),WEB容器執行完自訂標籤的標籤體後,就會接著去執行自訂標籤的結束標記,此時,WEB容器會去調用標籤處理器的doEndTag方法。
5)、public void release(),通常WEB容器執行完自訂標籤後,標籤處理器會駐留在記憶體中,為其它請求伺服器,直至停止web應用時,web容器才會調用release方法。
4. JSP標籤API
• JSP 1.1和1.2規範中常用的介面主要有以下3個。
– Tag:此介面定義對於所有標籤處理類都需要實現的方法。
– IterationTag:此介面擴充了Tag介面,增加了控制重複執列標籤主體的方法。
– BodyTag:此介面擴充了IterationTag介面,並增加了訪問和操作標籤主體內容的方法。
5. 標籤庫描述符
標籤庫描述符檔案是一個以“.tld”結尾的標準XML文檔,用來記錄一個標籤庫內擁有哪些標籤、每個標籤包含哪些屬性。
以下是一個JSP 2.0規範的標籤庫描述檔案的內容:<taglib>元素是標籤庫描述符的根項目,它包含12個子項目,詳細介紹如下,(粗體元素是常用元素,記住)。
– (1)<description>:標籤庫的一個文本描述。
– (2)<tlib-version>:指定標籤庫的版本。
– (3)<short-name>:為標籤定義簡短的名字,在taglib指令中可作為首選的首碼名使用。
– (4)<uri>:定義一個URI,用於唯一地標識此標籤庫。
– (5)<tag>:用於指定自訂標籤的相關資訊。
– (6)<display-name>:為標籤庫指定一個簡短的別名。
– (7)<small-icon>:為標籤庫指定大小為16×16的小表徵圖(gif或jpeg格式),該表徵圖可在圖形介面工具中顯示。
– (8)<large-icon>:為標籤庫指定大小為32×32的大表徵圖(gif或jpeg格式),該表徵圖可在圖形介面工具中顯示。
– (9)<validator>:為標籤庫提供一個驗證器。
– (10)<listener>:為標籤庫提供一個監聽器。
– (11)<tag-file>:用於描述標籤檔案。
– (12)<function>:用於指定在運算式語言中使用的函數。
6. 傳統標籤的開發
在開發傳統標籤之前,需要瞭解清楚兩個支援類(TagSupport和BodyTagSupport)的生命週期。
TagSupport類的生命週期可以用圖來表示
BodyTagSupport類的生命週期可以用圖來表示。
7. 用BodyTagSupport類開發自訂標籤
• BodyTagSupport類中增加了兩個方法:
– setBodyContent(BodyContent bc):容器在執行這個標籤處理類的執行個體時,將調用該方法,把標籤主體返回的內容緩衝在BodyContent類的執行個體中。BodyContent除了從父類JspWriter繼承提供用於向響應體中寫入文本的方法,還提供了用於擷取它緩衝的標籤體內容。
– doInitBody():計算標籤主體之前調用該方法進行初始化共,可以向bodyContent對象中寫入初始內容,這些內容會放置在標籤主體內容之前。
• BodyContent類專門用於緩衝標籤主體返回的內容,包括靜態文本以及由嵌套標籤或指令碼元素所建立的動態內容。
傳統的自訂標籤的作用或應用:
– 控制jsp頁面某一部分內容是否執行。
– 控制整個jsp頁面是否執行。
– 控制jsp頁面內容重複執行。
– 修改jsp頁面內容輸出。
• 自訂標籤除了可以移除jsp頁面java代碼外,它也可以實現以上功能。
• tld檔案中的四種標籤體類型
– EMPTY JSP scriptless tagdepentend