iT邦幫忙

DAY 25
4

C# Web 開發 跳到 Java Web開發系列 第 22

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

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

在這一篇我們會在詳細的看一下自定義標籤的執行流程。
(和我部落格同時發佈:http://www.dotblogs.com.tw/alantsai/archive/2013/10/17/tag-tag_flow.aspx
執行順序
首先我們先來看一張流程圖:

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


上一篇
[JSTL]自定義標籤庫
下一篇
[Tag] TagSupport 模板和使用Attribute
系列文
C# Web 開發 跳到 Java Web開發27
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

我要留言

立即登入留言