自定義標籤

 

自定義標籤

移除jsp頁面中的java代碼

創建步驟:

(1)       標籤處理器-----java類,直接或間接的實現專門的tag接口

(2)       編寫一個名字爲  .tld  標籤庫描述符文件

(3)       在jsp頁面中使用自定義標籤

<dhw:viewIP>等價於<%String ip=request.getRemoteAddr out.println(ip); %>

 

Tag接口的執行流程

Jsp引擎將遇到自定義標籤時,首先創建標籤的實例對象,然後按照jsp規範定義的通信規則一次調用他的方法

1、  public void setPageContext(PageContext pc),jsp引擎實例化標籤處理器後,將調用setPageContext方法將jsp頁面的pageContext對象與jsp頁面進行通信

2、  public void detParent(Tag t),setPageContext方法執行完後,web容器接着調用的setParent()方法將當前父標籤傳遞給當前標籤處理器,如果當前沒有父標籤,則傳遞給setParent方法的參數值爲null

3、  public int doStartTag(),調用了setPageContext方法和setParent方法之後,web容器執行到自定義標籤的開始標記時,就會調用標籤處理器的doStartTag方法

4、  pubic int doEndTag(),web容器執行玩自定義標籤體後,就會接着去執行自定義

標籤的結束標記,此時,web容器回去調用標籤處理器的doEndTag()方法

5、public void release(),通常web容器執行完自定義標籤後,標籤處理器灰主流在內存中,爲其他請求服務器,直至停止web應用時,web容器纔會調用release方法

自定義標籤功能擴展

    控制jsp頁面中的某一段部分是否執行

       通過doStartTag()的返回值決定是否處理處理標籤體的內容

    控制標籤後的jsp頁面是否執行

       通過doEndTag()的返回值決定是否繼續處理jsp頁面中自定義的標籤

    控制jsp頁面中的某一部分是否重複執行

通過Interation接口中的doAfterBody()的返回值可以決定jsp頁面中的某一部分是否要重複執行標籤體的內容

    修改jsp頁面內容輸出

       BodyTagSupport類中的方法getContext()方法可以存儲標籤體內容進行修改

使用到的接口、類的層次

JspTag接口《------Tag接口《------interationTag接口《--------BodyTag接口

           |                   |《---TagSupport類     |《----BodyTagSupport

                                          |--------------------》|

|

|《---SimpleTag接口《-----SimpleTagSupport

 

SimpleTag方法

setJspContext方法:用於把jsp頁面的pageContext對象傳遞給標籤處理器對象

setParent方法:用於把父標籤處理器對象傳遞給當前的標籤處理器對象

getParent方法:用於獲得當前標籤的父標籤處理器對象

setJspBody方法:用於把代表標籤體的jspFragment對象關於傳遞給標籤處理器對象

dotage方法:用於完成所有的標籤邏輯,包括輸出、迭代、修改標籤體內容等。在doTag方法中可以跑出javax.servlet.jsp.SkipPageException異常,用於通知web容器不再執行jsp頁面中位於結束標記後面的內容,這等效於傳統標籤的doEndTag方法返回Tag.SKIP_PAGE常量的情況

SimpleTag接口方法的執行順序

·當web容器開始執行標籤時,會調用如下的方法完成標籤的初始化

Web容器調用標籤處理器對象的setJspContext方法,將代表jsp頁面的pageContext對傳遞給標籤處理器對象

Web容器調用標籤處理器對象的setParent方法,將父標籤處理器對象傳遞給這個標籤處理器對象,注意,只有在標籤存在的父標籤的情況下,web容器纔會調用這個方法

如果調用標籤時設置了屬性,容器將調用每個屬性對應的setter方法把屬性值傳給標籤處理器對象。如果標籤的屬性值是el表達式或者腳本表達式,則web容器首先計算表達式的值,然後把值傳遞給標籤處理器對象

如果簡單標籤有標籤體,容器將調用setJspBody方法把標籤體的JsoFragment對象傳遞過來

·執行標籤時:

容器調用標籤處理器的doTag()方法,開發人員在方法內通過操作JspFrament對象,就可以直線是否執行、迭代、修改標籤體的目的

JspFramgment類

·Javax.servlet.tagext.JspFragment類是在jsp2.0中定義的,他在實例對象代表jsp頁面中的一段符合jsp語法規範的jsp片段,這段jsp片段中不能包含jsp腳本元素

·web容器在處理簡單標籤體時,會把表前提的內容用以JspFragment對象表示,並在調用標籤處理器對象的setJspBody方法把JspFragment對象表示,並調用標籤處理器對象的setJspBody方法把JspFragment對象傳遞給標籤處理器對象。JspFragment類中只定義了兩個方法,如下所示:

       getJspContext方法:用於返回代表頁面的JspContext對象

       public abstract void invoke(java.weiter out)

用於執行JspFragment對象的執行結果寫入到哪個輸出流對象中,如果傳遞給參數out的值爲null,則將執行結果寫入到JspContext.getOut()方法返回的輸出流對象中

Invoke方法詳解

·JspFragment.invoke方法可以說是JspFragment最重要的方法,利用這個方法可以控制是否執行和輸出標籤體的內容、是否迭代執行標籤體的內容或對標籤的執行結果進行修改後再輸出

       ·在標籤體中如果沒有調用JspFragment方法

·在標籤處理器中如果沒有重複調用JspFragment.invoke方法,則標籤體內容將會被重複執行

·若想在標籤處理器中修改標籤內容,只需調用invoike方法是指定一個可取出結果數據的輸出流對象(例如 String Writer),讓標籤體的執行結果輸出到該輸出流對象中,然後從該輸出流對象中取出數據進行修改後再輸出到目標設備,即可達到修改標籤體的目的

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