jstl自定義標簽接口介紹

jopen 8年前發布 | 12K 次閱讀 JSP Java開發

1. JspTag接口

JspTag接口是所有自定義標簽的父接口,它是JSP2.0中新定義的一個標記接口,沒有任何屬性和方法。JspTag接口有Tag和SimpleTag兩個直接子接口,JSP2.0以前的版本中只有Tag接口,所以把實現Tag接口的自定義標簽也叫做傳統標簽,把實現SimpleTag接口的自定義標簽叫做簡單標簽。本書中如果沒有特別說明,自定義標簽泛指傳統標簽。

2. Tag接口

圖6.5中的Tag接口是所有傳統標簽的父接口,其中定義了兩個重要方法(doStartTag、doEndTag)方法和四個常量(EVAL_BODY_INCLUDE、SKIP_BODY、EVAL_PAGE、SKIP_PAGE),這兩個方法和四個常量的作用如下:

(1)WEB容器在解釋執行JSP頁面的過程中,遇到自定義標簽的開始標記就會去調用標簽處理器的doStartTag方法,doStartTag方法執行完后可以向WEB容器返回常量EVAL_BODY_INCLUDE或SKIP_BODY。如果doStartTag方法返回EVAL_BODY_INCLUDE,WEB容器就會接著執行自定義標簽的標簽體;如果doStartTag方法返回SKIP_BODY,WEB容器就會忽略自定義標簽的標簽體,直接解釋執行自定義標簽的結束標記。

(2)WEB容器解釋執行到自定義標簽的結束標記時,就會調用標簽處理器的doEndTag方法,doEndTag方法執行完后可以向WEB容器返回常量EVAL_PAGE或SKIP_PAGE。如果doEndTag方法返回常量EVAL_PAGE,WEB容器就會接著執行JSP頁面中位于結束標記后面的JSP代碼;如果doEndTag方法返回SKIP_PAGE,WEB容器就會忽略JSP頁面中位于結束標記后面的所有內容。

doStartTagdoEndTag方法的作用和返回值的作用可以看出,開發自定義標簽時可以在doStartTag方法和doEndTag方法體內編寫合適的Java程序代碼來實現具體的功能,通過控制doStartTag方法和doEndTag方法的返回值,還可以告訴WEB容器是否執行自定義標簽中的標簽體內容和JSP頁面中位于自定義標簽的結束標記后面的內容。

2. IterationTag接口

IterationTag接口繼承了Tag接口,并在Tag接口的基礎上增加了一個doAfterBody方法和一個EVAL_BODY_AGAIN常量。實現IterationTag接口的標簽除了可以完成Tag接口所能完成的功能外,還能夠通知WEB容器是否重復執行標簽體內容。對于實現了IterationTag接口的自定義標簽WEB容器在執行完自定義標簽的標簽體后,將調用標簽處理器的doAfterBody方法,doAfterBody方法可以向WEB容器返回常量EVAL_BODY_AGAIN或SKIP_BODY。如果doAfterBody方法返回EVAL_BODY_AGAIN,WEB容器就會把標簽體內容再重復執行一次,執行完后接著再調用doAfterBody方法,如此往復,直到doAfterBody方法返回常量SKIP_BODY,WEB容器才會開始處理標簽的結束標記和調用doEndTag方法。

可見,開發自定義標簽時,可以通過控制doAfterBody方法的返回值來告訴WEB容器是否重復執行標簽體內容,從而達到循環處理標簽體內容的效果。例如,可以通過一個實現IterationTag接口的標簽來迭代輸出一個集合中的所有元素,在標簽體部分指定元素的輸出格式。

在JSP API中也提供了IterationTag接口的默認實現類TagSupport,讀者在編寫自定義標簽的標簽處理器類時,可以繼承和擴展TagSupport類,這相比實現IterationTag接口將簡化開發工作。

3. BodyTag接口

BodyTag接口繼承了IterationTag接口,并在IterationTag接口的基礎上增加了兩個方法(setBodyContent、doInitBody)和一個EVAL_BODY_BUFFERED常量。實現BodyTag接口的標簽除了可以完成IterationTag接口所能完成的功能,還可以對標簽體內容進行修改。對于實現了BodyTag接口的自定義標簽,標簽處理器的doStartTag方法不僅可以返回前面講解的常量EVAL_BODY_INCLUDE或SKIP_BODY,還可以返回常量EVAL_BODY_BUFFERED。如果doStartTag方法返回EVAL_BODY_BUFFERED,WEB容器就會創建一個專用于捕獲標簽體運行結果的BodyContent對象,然后調用標簽處理器的setBodyContent方法將BodyContent對象的引用傳遞給標簽處理器,WEB容器接著將標簽體的執行結果寫入到BodyContent對象中。在標簽處理器的后續事件方法中,可以通過先前保存的BodyContent對象的引用來獲取標簽體的執行結果,然后調用BodyContent對象特有的方法對BodyContent對象中的內容(即標簽體的執行結果)進行修改和控制其輸出。

在JSP API中也提供了BodyTag接口的實現類BodyTagSupport,讀者在編寫能夠修改標簽體內容的自定義標簽的標簽處理器類時,可以繼承和擴展BodyTagSupport類,這相比實現BodyTag接口將簡化開發工作。

4. SimpleTag接口

SimpleTag接口是JSP2.0中新增的一個標簽接口。由于傳統標簽使用三個標簽接口來完成不同的功能,顯得過于繁瑣,不利于標簽技術的推廣,因此,SUN公司為降低標簽技術的學習難度,在JSP 2.0中定義了一個更為簡單、便于編寫和調用的SimpleTag接口。SimpleTag接口與傳統標簽接口最大的區別在于,SimpleTag接口只定義了一個用于處理標簽邏輯的doTag方法,該方法在WEB容器執行自定義標簽時調用,并且只被調用一次。那些使用傳統標簽接口所完成的功能,例如是否執行標簽體、迭代標簽體、對標簽體內容進行修改等功能都可以在doTag方法中完成。關于SimpleTag接口的詳細介紹本書將在第7章詳細講解。

在JSP API中也提供了SimpleTag接口的實現類SimpleTagSupport,讀者在編寫簡單標簽時,可以繼承和擴展SimpleTagSupport類,這相比實現SimpleTag接口將簡化開發工作。

 

為方便讀者日后查詢傳統標簽接口中的各個方法可以返回的返回值,筆者在表6.1列舉了Tag接口、IterationTag接口和BodyTag接口中的主要方法及它們分別可以返回的返回值的說明。

表6.1

 


來自: http://my.oschina.net/oschenxiaomo/blog/596872

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!