[Tag] 繼承BodyTagSupport來實作能夠處理有body的tag

上一篇介紹了如何繼承TagSupport來更簡單製作自定義tag,還記得之前我們介紹Tag interface的時候提到過的流程,相信有注意到曾經提過我們能夠設定是否能夠有body的內容。

我們這一篇會介紹如何來處理Tag裡面body的部份。

前言

上一篇介紹了如何繼承TagSupport來更簡單製作自定義tag,還記得之前我們介紹Tag interface的時候提到過的流程,相信有注意到曾經提過我們能夠設定是否能夠有body的內容。

我們這一篇會介紹如何來處理Tag裡面body的部份。

BodyTagSupport簡單介紹

BodyTagSupport和TagSupport一樣的概念,他們都是實作了Tag Interface的模板class,差別在於BodyTagSupport比一般的Tag流程增加了body處理的部份。

如果今天我們自定義Tag需要能夠處理body,那麼就繼承BodyTagSupport就可以。

BodyTagSupport的執行流程

和Tag流程一樣,不過多了處理body的部份:

4386732

這邊只顯示了和body有關的相關流程。基本上如果繼承了BodyTagSupport,只要在setBodyContent()之後的方法都可以取得body的內容。

EVAL_BODY和EVAL_BODY_BUFFERED差異在於EVAL_BODY是直接把body內容輸出來,而EVAL_BODY_BUFFERED則是把body執行過後的內容先放到buffer裡面,等到後面需要的時候可以把它取出來。

SEVAL_BODY_AGAIN則會允許再次執行doAfterBody()。

範例:把tag裡面的字串全部變小寫

public class TestBodyTag extends BodyTagSupport {

	@Override
	public int doEndTag() throws JspException {
		 
		String bodyContent = this.getBodyContent().getString();
		
		try {
			this.pageContext.getOut().println(bodyContent.toLowerCase());
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		return super.doEndTag();
	}

}

我們這邊只是把body內容取出來,然後把所有的字串變成小寫的字母。因為doEndTag()的時候bodyContent相關的內容已經完成了,因此我們取得到內容。

多次執行body的內容

從上面的流程應該看的出來我們其實可以在doAfterBody()返回不同的值來重複執行body的部份,西面我們會把body內容輸出5行,每一行的次數都和目前第幾次一樣:

private int loopTime = 5;

@Override
public int doAfterBody() throws JspException {
	if(loopTime > 0)
	{
		try {
			this.getPreviousOut().println(this.getBodyContent().getString());
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		loopTime = loopTime - 1;
		return EVAL_BODY_AGAIN;
	}
	else
	{
		return SKIP_BODY;
	}
}

結語

這邊我們介紹了如何處理tag body裡面的部份。其實我們也可以在tag裡面在自定義tag,概念上面來說一模一樣。只是我們在定義tld的時候在Tag標籤又在定義一個 tag就可以。

希望透過這篇能夠瞭解到Tag是如何處理body內容的。

Dotblogs 的標籤: ,

Google+

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