在上一篇我們看到了基本要實作一個tag的方法,相信在過程當中大家對於doStartTag()和doEndTag()差異感到興趣,同時他們回傳的東西到底代表著什麼。
在這一篇我們會在詳細的看一下自定義標籤的執行流程。
前言
在上一篇我們看到了基本要實作一個tag的方法,相信在過程當中大家對於doStartTag()和doEndTag()差異感到興趣,同時他們回傳的東西到底代表著什麼。
在這一篇我們會在詳細的看一下自定義標籤的執行流程。
執行順序
首先我們先來看一張流程圖:
假設今天我們的tag長這樣:
<parent>
<hello:test>hello</hello:test>
</parent>
接下來我們會用這個來說明執行流程。
兩個set method
還記得我們有兩個set Method需要override,而這兩個method會在執行自定義tag的時候先被呼叫。目的是能夠用IoC的概念把在執行這個tag的instance(setPageContext) assign進來給我們使用。還有set包住我們這個Tag的父Tag,讓我們如果有需要可以使用。
這兩個set method幫我們注入了兩個我們可以使用的參數,讓我們可以在需要的時候呼叫。
以上面的例子來說<parent>將會是setParent()所傳進來的參數,而在parse這個tag的jsp,就是setPageContext()所傳進來的參數。
doStartTag()
當jsp頁面parse到了<hello:test>
的時候,doStartTag()就會被呼叫。我們可以依照回傳的數字不同(Interface已經定義好這些數字的意思)來決定是否要執行我們tag裡面的body。以這個例子來說就是hello
。
以我們這個例子來說好像沒有什麼意義,但是當我們的body可能是另外一個tag,我們可以再這邊決定是否要執行裡面的tag。
假設我們要執行body裡面的內容,那麼另外一個tag流程又開始,而此tag將會成為body要執行的tag的parent。
doEndTag()
以上面的例子來說,我們就已經到了</hello:test>
的地方。
這個時候我們tag已經接近了結束了,因此如果需要輸出或什麼可以再這邊執行。
這邊也會依照回傳的數字不同而影響到接下來的流程。
假設你發覺整個在輸出下去就沒有什麼用了,那麼如果回傳SKIP_PAGE
的話,整個程式會在這邊做一個return。所以這個</hello:test>之後的東西都不會執行(也不會輸出)。
而如果EVAL_PAGE
被回傳,那麼此tag到此是結束了,但是此tag之後的內容都還是會被處理。
結語
這一篇介紹了一個最基本的tag執行流程。當然每一次自定義tag都需要重複寫一樣的太花時間,所以很多Class已經實作了tag,我們可以直接繼承這些tag 來更容易的實作自定義tag。
瞭解一個Tag執行的流程非常重要,因為之後介紹的class都是實作了tag然後會在多加東西,這些會影響到執行流程,不過這種影響對開發著來說是又一層的 encapsulation,讓開發者可以快速的製作tag。