JSP自定義標籤詳解1

JSP自定義標籤

自定義JSP標籤概述

自定義JSP標籤就是程序員定義的一種JSP標籤,這種標籤把那些信息顯示邏輯封裝在一個單獨的Java類中,通過一個XML文件來描述它的使用。當頁面中需要使用類似的顯示邏輯時,就可以在頁面中插入這個標籤,從而完成相應的功能。

使用自定義標籤,可以分離程序邏輯和表示邏輯,將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類專門用於緩存標籤主體返回的內容,包括靜態文本以及由嵌套標籤或腳本元素所創建的動態內容。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章