JSP自定義標籤由淺到深詳細講解(全)

一、基本概念

1.標籤(Tag):

  標籤是一種XML元素,通過標籤可以使JSP網頁變得簡潔並且易於維護,還可以方便地實現同一個JSP文件支持多種語言版本。由於標籤是XML元素,所以它的名稱和屬性都是大小寫敏感的

  2.標籤庫(Tag library):

  由一系列功能相似、邏輯上互相聯繫的標籤構成的集合稱爲標籤庫。

  3.標籤庫描述文件(Tag Library Descriptor):

  標籤庫描述文件是一個XML文件,這個文件提供了標籤庫中類和JSP中對標籤引用的映射關係。它是一個配置文件,和web.xml是類似的。

  4.標籤處理類(Tag Handle Class):

  標籤處理類是一個Java類,這個類繼承了TagSupport或者擴展了SimpleTag接口,通過這個類可以實現自定義JSP標籤的具體功能

  二、自定義JSP標籤的格式:

  1.爲了使到JSP容器能夠使用標籤庫中的自定義行爲,必須滿足以下兩個條件:

  1)從一個指定的標籤庫中識別出代表這種自定義行爲的標籤

  2)找到實現這些自定義行爲的具體類

  第一個必需條件-找出一個自定義行爲屬於那個標籤庫-是由標籤指令的前綴(Taglib Directive’s Prefix)屬性完成,所以在同一個頁面中使用相同前綴的元素都屬於這個標籤庫。每個標籤庫都定義了一個默認的前綴,用在標籤庫的文檔中或者頁面中插入自定義標籤。所以,你可以使用除了諸如jsp,jspx,java,servlet,sun,sunw(它們都是在JSP白皮書中指定的保留字)之類的前綴。  

  uri屬性滿足了以上的第二個要求。爲每個自定義行爲找到對應的類。這個uri包含了一個字符串,容器用它來定位TLD文件。在TLD文件中可以找到標籤庫中所有標籤處理類的名稱

  2. 當web應用程序啓動時,容器從WEB-INF文件夾的目錄結構的META-INF搜索所有以.tld結尾的文件。也就是說它們會定位所有的TLD文件。對於每個TLD文件,容器會先獲取標籤庫的URI,然後爲每個TLD文件和對應的URI創建映射關係。

  在JSP頁面中,我們僅需通過使用帶有URI屬性值的標籤庫指令來和具體的標籤庫匹配

  三、自定義JSP標籤的處理過程:

  1.在JSP中引入標籤庫:  

  2.在JSP中使用標籤庫標籤

  3.Web容器根據第二個步驟中的prefix,獲得第一個步驟中聲明的taglib的uri屬性值

  4.Web容器根據uri屬性在web.xml找到對應的元素 5.從元素中獲得對應的元素的值 6.Web容器根據元素的值從WEB-INF/目錄下找到對應的.tld文件 7.從.tld文件中找到與tagname對應的元素 8.湊元素中獲得對應的元素的值 9.Web容器根據元素的值創建相應的tag handle class的實例 10. Web容器調用這個實例的doStartTag/doEndTag方法完成相應的處理

  四、創建和使用一個Tag Library的基本步驟:

  1.創建標籤的處理類(Tag Handler Class)

  2.創建標籤庫描述文件(Tag Library Descrptor File)

  3.在web.xml文件中配置元素 4.在JSP文件中引人標籤庫

  五、TagSupport類簡介:

  1.處理標籤的類必須擴展javax.servlet.jsp.TagSupport.

  2.TagSupport類的主要屬性:

  A.parent屬性:代表嵌套了當前標籤的上層標籤的處理類

  B.pageContex屬性:代表Web應用中的javax.servlet.jsp.PageContext對象

  3.JSP容器在調用doStartTag或者doEndTag方法前,會先調用setPageContext和setParent方法,設置pageContext和parent。因此在標籤處理類中可以直接訪問pageContext變量

  4.在TagSupport的構造方法中不能訪問pageContext成員變量,因爲此時JSP容器還沒有調用

  setPageContext方法對pageContext進行初始化

  六、TagSupport處理標籤的方法:

  1.TagSupport類提供了兩個處理標籤的方法:

   public int doStartTag() throws JspException

   public int doEndTag() throws JspException

  2.doStartTag:但JSP容器遇到自定義標籤的起始標誌,就會調用doStartTag()方法。

   doStartTag()方法返回一個整數值,用來決定程序的後續流程。

  A.Tag.SKIP_BODY:表示?>…之間的內容被忽略

  B.Tag.EVAL_BODY_INCLUDE:表示標籤之間的內容被正常執行

  3.doEndTag:但JSP容器遇到自定義標籤的結束標誌,就會調用doEndTag()方法。doEndTag()方法也返回一個整數值,用來決定程序後續流程。

  A.Tag.SKIP_PAGE:表示立刻停止執行網頁,網頁上未處理的靜態內容和JSP程序均被忽略任何已有的輸出內容立刻返回到客戶的瀏覽器上。

  B.Tag_EVAL_PAGE:表示按照正常的流程繼續執行JSP網頁

  七、用戶自定義的標籤屬性:

  如果在標籤中還包含了自定義的屬性,那麼在標籤處理類中應該將這個屬性作爲成員變量,並且分別提供設置和讀取屬性的方法。

  八、創建標籤處理類的步驟:

  1.創建包含JSP網頁靜態文本的文件(即是要替換自定義JSP標籤的文本)

  2.在Web應用啓動時裝載靜態文本

  3.創建標籤處理類

  九、如何創建包含JSP網頁靜態文本的文件:

  1.使用java.util.Properties類來存放要替換網頁中自定義JSP標籤的靜態文本

  2.Properties類代表了一系列屬性的集合,其實例既可以被保存到流中,也可以從流中加載。這些文本以key/value的形式存放在WEB-INF目錄下,例如key=value,在屬性列表中這些key/value都是String類型的

  十、Properties類的常用API:

  1.setProperty(String key, String value):調用Hashtable類的put方法添加屬性

  2.getProperty(String key):獲取屬性列表中key對應的屬性值

  3.load(InputStream in):從輸入流對象InputStream中讀取屬性列表(Properties list)

  4.store(OutputStream out,String coMMent):使用適當的格式將屬性列表的屬性對寫入輸出流對象中,默認使用ISO-88590-1編碼格式,以行的方式處理輸入。屬性的key/value之間以”=、:”配對,以回車、換行分隔key/value配對

十一、ServletContext類的常用API

1、getContext(String uripath):返回服務器中uripath所代表的ServletContext對象;

2、getInitParameter(String name):返回ServletConfig對象中name參數的值;

3、getMineType(String file):返回file參數代表的文件的MIME類型;

4、getRequestDispatcher(String path):返回path代表的RequestDispacher對象;

5、getResourceAsStream(String path):以輸入流的形式返回path對應的資源,在輸入留中對象可以爲任意形式的數據,path參數必須以“/”開始且相對於Context Root。

十二、如何使用ServletContxt讀取並保存屬性文件

1、創建java.util.Properties類對象;

2、獲取ServletContext對象;

3、將屬性文件以輸入流的形式讀入到某個輸入流對象中;

4、將輸入流對象加載到Properties對象中;

5、將Properties對象保存到ServletContext對象中。

十三、如何在Web應用啓動時裝載靜態文本

1、創建繼承了HttpServlet類的子類,在web.xml中配置這Servlet時設置load-on-startup屬性:

someclass
somepackage.SomeClass1

2、在這個Servlet的init()方法中創建java.util.Properties類

3、獲取當前Web應用的ServletContext對象

4、將WEB-INF目錄下的屬性文件讀入到輸入流InputStream中:

InputStream in = context.getResourceAsString(“WEB-INF/someproperties.properties”);
5、將輸入流加載到屬性對象中

ps.load(in);

6、將屬性對象保存到上

context.setAttribute(“attributeName”,ps);
十四、如何創建標籤處理類

1、引入必需的資源

import javax.servlet.jsp.; import javax.servlet.http.; import java.util.; import java.io.;
2、繼承TagSupport類並覆蓋doStartTag()/doEndTag()方法

3、從ServletContext對象中獲取java.util.Properties對象

4、從Properties對象中獲取key對應的屬性值

5、對獲取的屬性進行相應的處理並輸出結果

十五、創建標籤庫描述文件(Tag Library Descriptor)

1、標籤庫描述文件,簡稱TLD,採用XML文件格式,定義了用戶的標籤庫。TLD文件中的元素可以分成3類:

A.標籤庫元素
B.標籤元素
C.標籤屬性元素

2、標籤庫元素用來設定標籤庫的相關信息,它的常用屬性有:

A.shortname:指定Tag Library默認的前綴名(prefix);

B.uri:設定Tag Library的惟一訪問表示符。

3、標籤元素用來定義一個標籤,它的常見屬性有:

A.name:設定Tag的名字;

B.tagclass:設定Tag的處理類;

C.bodycontent:設定標籤的主體(body)內容。

1)empty:表示標籤中沒有body;
2)JSP:表示標籤的body中可以加入JSP程序代碼;
3)tagdependent:表示標籤中的內容由標籤自己去處理。

4、標籤屬性元素用來定義標籤的屬性,它的常見屬性有:

A.name:屬性名稱;
B.required:屬性是否必需的,默認爲false;
C.rtexprvalue:屬性值是否可以爲request-time表達式,也就是類似於< %=…% >的表達式。

十六、在Web應用中使用標籤

1、如果Web應用中用到了自定義JSP標籤,則必須在web.xml文件中加入元素,它用於聲明所引用的標籤所在的標籤庫

/sometaglib
/WEB-INF/someTLD.tld

2、設定Tag Library的惟一標示符,在Web應用中將根據它來引用Tag Libray;

3、指定和Tag Library對應的TLD文件的位置;

4、在JSP文件中需要加入

啓動服務器,如果一切按照上面步驟的話,就能看到 Test Tag: Hello! TEST 字樣。最簡單的tag就這麼出來了。並不難,是不是?

Tag系列的Interface裏定義的靜態int,通過他們也能一窺tag組鍵的執行流程,這幾個靜態值分別是:
SKIP_BODY : 跳過了開始和結束標籤之間的代碼,一般是在doStartTag中使用
EVAL_BODY_INCLUDE :處理嵌套的標籤,一般是在doStartTag中使用,由負責處理標籤正文的tag接口提供
EVAL_BODY_BUFFERED :對包含的內容進行解析 一般是在doStartTag中使用,由負責處理標籤正文的bodyTag接口提供,目的是通知jsp容器作好讀取正文的工作(創建一個body- content包裝正文和獲取存放操作結果的out對象,便於以後的操作和輸出).
EVAL_BODY_AGAIN:處理標籤正文,嵌套標籤的iteratorTag接口的使用
SKIP_PAGE : 忽略剩下的頁面,一般是在doEndTag中使用
EVAL_PAGE : 繼續執行下面的頁, 一般是在doEndTag中使用

——————————————–end———————————————–


 一、JSP自定義標籤簡介

  標籤是一種XML元素,通過標籤可以使JSP網頁變得簡潔並且易於維護,還可以方便地實現同一個JSP文件支持多種語言版本。由於標籤是XML元素,所以它的名稱和屬性都是大小寫敏感的

  標準JSP標籤是用來調用JavaBean組件的操作,處理定向請求以簡化JSP頁面開發與維護。JSP技術提供了一種封裝其它動態類型的機制——自定義標籤,它擴展了JSP語言。自定義標籤通常發佈在標籤庫中,該庫定義了一個自定義標籤集幷包含實現標籤的對象。

  自定義標籤是用戶定義的JSP語言元素。當JSP頁面包含一個自定義標籤時被轉化爲servlet,標籤轉化爲對稱爲tag handler的對象的操作。接着當servlet執行時Web container調用那些操作。

  二、兩種標籤

  可以定義兩種類型的標籤:

javax.servlet.jsp.tagext.Tag
javax.servlet.jsp.tagext.BodyTag

  有標籤體的標籤必須實現 BodyTag 接口。


body

  也可能沒有標籤體:

  無標籤體的簡單標籤可以實現 Tag 接口。

  三、標籤處理程序

  int doStartTag() throws JspException—處理開始標籤

  int doEndTag() throws JspException—處理結束標籤

  Tag getParent()/void setParent(Tag t)—獲得/設置標籤的父標籤

  void setPageContext(PageContext pc)— pageContext 屬性的 setter 方法

  void release() 釋放獲得的所有資源

 doStartTag()和doEndTag()方法的返回值說明:

  SKIP_BODY      表示不用處理標籤體,直接調用doEndTag()方法。

  SKIP_PAGE      忽略標籤後面的jsp(SUN企業級應用的首選)內容。

  EVAL_PAGE      處理標籤後,繼續處理jsp(SUN企業級應用的首選)後面的內容。

  EVAL_BODY_BUFFERED 表示需要處理標籤體,且需要重新創建一個緩衝(調用setBodyContent方法)。

  EVAL_BODY_INCLUDE  表示在現有的輸出流對象中處理標籤體,但繞過setBodyContent()和doInitBody()方法

  EVAL_BODY_AGAIN     對標籤體循環處理。(存在於javax.servlet.jsp.tagext.IterationTag接口中)

  實現javax.servlet.jsp.tagext.Tag接口

  擴展javax.servlet.jsp.tagext.TagSupport類

  TagSupport 類定義了 get/setParent() 和 setPageContext(),這與所有標籤處理程序幾乎相同。

  get/setParent() 方法允許標籤嵌套。

  TagSupport 類還定義了一個可以被子類使用的 pageContext 實例變量 (protected PageContext pageContext),這個變量是由 setPageContext() 方法設置的。

  在創建自定義標籤之前,需要創建一個 標籤處理程序。標籤處理程序是一個執行自定義標籤操作的 Java 對象。在使用自定義標籤時,要導入一個 標籤庫 —— 即一組標籤/標籤處理程序對。通過在 Web 部署描述符中聲明庫導入它,然後用指令 taglib 將它導入 JSP 頁。

  如果 JSP 容器在轉換時遇到了自定義標籤,那麼它就檢查 標籤庫描述符(tag library descriptor) (TLD) 文件以查詢相應的標籤處理程序。TLD 文件對於自定義標籤處理程序,就像 Web 部署描述符對於 servlet 一樣。

  在運行時,JSP 頁生成的 servlet 得到對應於這一頁面所使用的標籤的標籤處理程序的一個實例。生成的 servlet 用傳遞給它的屬性初始化標籤處理程序。

  標籤處理程序實現了 生存週期 方法。生成的 servlet 用這些方法通知標籤處理程序應當啓動、停止或者重複自定義標籤操作。生成的 servlet 調用這些生存週期方法執行標籤的功能。

  四、TLD 文件

  TLD 文件的根元素是 taglib。taglib 描述了一個 標籤庫 —— 即一組標籤/標籤處理程序對。

  因爲我們使用的是 JSP 版本 1.2,所以在這個例子中需要 tlib-version 和 short-name 元素。

  tlib-version 元素對應於標籤庫版本。

  jsp-version 對應於標籤庫所依賴的 JSP 技術的版本。

  short-name 元素定義了 IDE 和其他開發工具可以使用的標籤庫的簡單名。

  taglib 元素包含許多 tag 元素,標籤庫中每一個標籤有一個 tag 元素。

  在JSP中導入TLD文件:

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