上一篇介紹了如何繼承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內容的。