開發自定義標籤的時候可以繼承TagSupport或着BodyTagSupport,實際上bodyTagSupport已經繼承了tagSupport這個類.
TagSupport:
當繼承TagSupport後,需要至少重寫doStartTag這個方法.這個方法將得到標籤起始時的一些信息,這個方法的合理返回值有兩個,分別爲EVAL_BODY_INCLUDE和SKIP_BODY,前者的意思爲執行標籤體的內容,而後者的意思爲跳過標籤體的內容.
其次:doAfterBody方法,該方法在每一次標籤體執行完成之後執行.其合法的返回值有:SKIP_BODY和EVAL_BODY_AGAIN.前者表示不再執行標籤體,後者表示再次執行標籤體.
再次爲doEndTag()該方法在標籤結束的時候調用,該方法的合法返回值有:SKIP_PAGE和EVAL_PAGE前者表示不再執行標籤之後的頁面內容,後者表示執行標籤後的內容.
用一個例子來說明之間的執行關係:
在這段代碼中,<logic:iterate id="user" name="users">系統執行doStartTag這個方法,其中id和name的值會被set到該標籤的實現類中.因爲這是一個處理循環的標籤,因此doStartTag需要進行是否需要進行標籤體的判斷.如果需要則返回EVAL_BODY_INCLUDE,否則執行SKIP_BODY.
參看代碼:
如果標籤爲一個循環,那麼系統將返回EVAL_BODY_INCLUDE,並且退出doStartTag這個方法,所以在這個時候,標籤體已經被執行了一次,當標籤體執行完一次以後,系統會再次調用doAfterBody這個方法,來判斷是否還需要進行標籤體的循環.
參考代碼:
如果仍然有循環,責再次執行標籤體,否則退出.
而doAfterTag則執行一些資源釋放等的工作.
具體的標籤調用如圖:
張海傑
2009-11-18