iT邦幫忙

DAY 27
2

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

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

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

我們這一篇會介紹如何來處理Tag裡面body的部份。
(和我部落格同時發佈:http://www.dotblogs.com.tw/alantsai/archive/2013/10/19/tag-bodytagsupport.aspx
BodyTagSupport簡單介紹

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

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

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

這邊只顯示了和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內容的。


上一篇
[Tag] TagSupport 模板和使用Attribute
下一篇
[Tag] Jsp 2.x Tag - interface SimpleTag
系列文
C# Web 開發 跳到 Java Web開發27

尚未有邦友留言

立即登入留言