1. JspTag接口 學習
JspTag接口是全部自定義標籤的父接口,它是JSP2.0中新定義的一個標記接口,沒有任何屬性和方法。JspTag接口有Tag和SimpleTag兩個直接子接口,JSP2.0之前的版本中只有Tag接口,因此把實現Tag接口的自定義標籤也叫作傳統標籤,把實現SimpleTag接口的自定義標籤叫作簡單標籤。本書中若是沒有特別說明,自定義標籤泛指傳統標籤。spa
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頁面中位於結束標記後面的全部內容。事件
從doStartTag和doEndTag方法的做用和返回值的做用能夠看出,開發自定義標籤時能夠在doStartTag方法和doEndTag方法體內編寫合適的Java程序代碼來實現具體的功能,經過控制doStartTag方法和doEndTag方法的返回值,還能夠告訴WEB容器是否執行自定義標籤中的標籤體內容和JSP頁面中位於自定義標籤的結束標記後面的內容。開發
2. IterationTag接口 it
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方法。io
可見,開發自定義標籤時,能夠經過控制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