[Tag] 實作javax.servlet.jsp.tagext.Tag的執行流程

在上一篇我們看到了基本要實作一個tag的方法,相信在過程當中大家對於doStartTag()和doEndTag()差異感到興趣,同時他們回傳的東西到底代表著什麼。

在這一篇我們會在詳細的看一下自定義標籤的執行流程。

前言

在上一篇我們看到了基本要實作一個tag的方法,相信在過程當中大家對於doStartTag()和doEndTag()差異感到興趣,同時他們回傳的東西到底代表著什麼。

在這一篇我們會在詳細的看一下自定義標籤的執行流程。

執行順序

首先我們先來看一張流程圖:

3481708

假設今天我們的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。

Dotblogs 的標籤: ,

Google+

創用 CC 授權條款
Alan Tsai 的隨手筆記Alan Tsai製作,以創用CC 姓名標示 4.0 國際 授權條款釋出。