JSP自定義標簽
自定義JSP標簽概述
自定義JSP標簽就是程序員定義的一種JSP標簽,這種標簽把那些信息顯示邏輯封裝在一個單獨的Java類中,通過一個XML文件來描述它的使用。當頁面中需要使用類似的顯示邏輯時,就可以在頁面中插入這個標簽,從而完成相應的功能。 www.2cto.com
使用自定義標簽,可以分離程序邏輯和表示邏輯,將Java代碼從HTML中剝離,便於美工維護頁面;自定義標簽也提供了可重用的功能組件,能夠提高工程的開發效率。
自定義標簽主要用於移除Jsp頁面中的java代碼。
自定義JSP標簽的執行過程
當一個含有自定義標簽的JSP頁面被JSP引擎(Web容器)轉譯成Servlet時,JSP引擎遇到自定義的標簽,會把這個自定義標簽轉化成對一個稱為“標簽處理類”的調用。之後,當這個JSP頁面被執行時,JSP引擎就會調用這個“標簽處理類”對象,並執行其內部定義的相應操作方法,從而完成相應的功能。
自定義JSP標簽的開發流程
使用Java處理類來開發自定義JSP標簽時,主要分為下幾個步驟。
創建標簽的處理類(Tag Handle Class)。這個類實現Tag接口,用來定義標簽的行為,並在JSP引擎遇到自定義標簽時調用執行。
創建標簽庫描述 (tld) 文件(Tag Library Descriptor File),在tld文件中對標簽處理器類進行描述。
在JSP文件中用taglib指令引入標簽庫,然後使用標簽庫描述文件中指定的標簽名來使用它。
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方法。
自定義標簽功能擴展
開發人員在編寫Jsp頁面時,經常還需要在頁面中引入一些邏輯,例如:
控制jsp頁面某一部分內容是否執行。
控制整個jsp頁面是否執行。
控制jsp頁面內容重復執行。
修改jsp頁面內容輸出。
自定義標簽除了可以移除jsp頁面java代碼外,它也可以實現以上功能。
tld文件中的四種標簽體類型
EMPTY JSP scriptless tagdepentend
JSP標簽API
JSP 1.1和1.2規范中常用的接口主要有以下3個。
Tag:此接口定義對於所有標簽處理類都需要實現的方法。
IterationTag:此接口擴展了Tag接口,增加了控制重復執行標簽主體的方法。
BodyTag:此接口擴展了IterationTag接口,並增加了訪問和操作標簽主體內容的方法。
標簽庫描述符
標簽庫描述符文件是一個以“.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>:用於指定在表達式語言中使用的函數。
TagSupport類的生命周期
建立標簽處理對象,然後將自定義標簽的屬性值入標簽處理對象中去,運行doStartTag()方法,顯示主體內容,運行doAfterBody()方法,再運行doEndTag()方法。
BodyTagSupport類的生命周期
建立標簽處理對象,然後將自定義標簽的屬性值入標簽處理對象中去,運行doStartTag()方法, (運行setBodyContent()方法,運行doInitBody()方法),顯示主體內容,運行doAfterBody()方法,再運行doEndTag()方法。
用BodyTagSupport類開發自定義標簽
BodyTagSupport類中增加了兩個方法:
setBodyContent(BodyContent bc):容器在執行這個標簽處理類的實例時,將調用該方法,把標簽主體返回的內容緩存在BodyContent類的實例中。BodyContent除了從父類JspWriter繼承提供用於向響應體中寫入文本的方法,還提供了用於獲取它緩沖的標簽體內容。
doInitBody():計算標簽主體之前調用該方法進行初始化共,可以向bodyContent對象中寫入初始內容,這些內容會放置在標簽主體內容之前。
BodyContent類專門用於緩存標簽主體返回的內容,包括靜態文本以及由嵌套標簽或腳本元素所創建的動態內容。