自定義標籤
移除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),讓標籤體的執行結果輸出到該輸出流對象中,然後從該輸出流對象中取出數據進行修改後再輸出到目標設備,即可達到修改標籤體的目的