BodyTagSupport類的方法: 編寫標(biāo)簽對應(yīng)的實現(xiàn)類時,需要重載BodyTagSupport類幾個方法:doStartTag(), setBodyContent(), doInitBody(), doAfterBody(), doEndTag(); 他們執(zhí)行順序如下: doStartTag()→doInitBody()→setBodyContent()→doAfterBody()→doEndTag() doStartTag()方法可返回EVAL_BODY_INCLUDE或SKIP_BODY, 如果返回EVAL_BODY_INCLUDE則繼續(xù)執(zhí)行; 如果返回SKIP_BODY則接下來的doInitBody(),setBodyContent(), doAfterBody()三個方法不會被執(zhí)行, 而直接執(zhí)行doEndTag()方法。 setBodyContent()方法用于設(shè)置標(biāo)簽體內(nèi)容,如果在此之前要作一些初始化工作,則在doInitBody()方法中完成。 標(biāo)簽體內(nèi)容執(zhí)行完后,會調(diào)用doAfterBody()方法,此方法可返回EVAL_BODY_TAG, SKIP_BODY, EVAL_PAGE或SKIP_PAGE。 如果返回EVAL_BODY_TAG則會再次設(shè)置標(biāo)簽體內(nèi)容,直到返回SKIP_BODY; 如果返回EVAL_PAGE則標(biāo)簽體執(zhí)行完后會繼續(xù)執(zhí)行JSP頁面中接下來的部分; 如果返回SKIP_PAGE,則JSP頁面的后續(xù)內(nèi)容將不再執(zhí)行。 標(biāo)簽中靜態(tài)常量: EVAL_BODY_INCLUDE:告訴服務(wù)器正文的內(nèi)容,并把這些內(nèi)容送入輸出流 SKIP_BODY:告訴服務(wù)器不要處理正文內(nèi)容 EVAL_PAGE:讓服務(wù)器繼續(xù)執(zhí)行頁面 SKIP_PAGE:讓服務(wù)器不要處理剩余的頁面 EVAL_BODY_AGAIN:讓服務(wù)器繼續(xù)處理正文內(nèi)容,只有doAfterBody方法可以返回 EVAL_BODY_BUFFERED:BodyTag接口的字段,在doStartTag()返回 EVAL_BODY_INCLUDE、SKIP_BODY一般由doStartTag()返回,而EVAL_PAPGE、SKIP_PAGE由doEndTag()返回。 |
TagSupport與BodyTagSupport的區(qū)別主要是標(biāo)簽處理類是否需要與標(biāo)簽體交互,如果不需要交互的就用TagSupport,否則如果需要交互就用BodyTagSupport。
交互就是標(biāo)簽處理類是否要讀取標(biāo)簽體的內(nèi)容和改變標(biāo)簽體返回的內(nèi)容。
用TagSupport實現(xiàn)的標(biāo)簽,都可以用BodyTagSupport來實現(xiàn),因為BodyTagSupport繼承了TagSupport。
2 、doStartTag(),doEndTag(),doAfterBody(),
doStartTag()方法是遇到標(biāo)簽開始時會呼叫的方法,其合法的返回值是EVAL_BODY_INCLUDE與SKIP_BODY,前者表示將顯示標(biāo)簽間的文字,后者表示不顯示標(biāo)簽間的文字;
doEndTag()方法是在遇到標(biāo)簽結(jié)束時呼叫的方法,其合法的返回值是EVAL_PAGE與 SKIP_PAGE,前者表示處理完標(biāo)簽后繼續(xù)執(zhí)行以下的JSP網(wǎng)頁,后者是表示不處理接下來的JSP網(wǎng)頁
doAfterBody()這個方法是在顯示完標(biāo)簽間文字之后呼叫的,其返回值有EVAL_BODY_AGAIN與SKIP_BODY,前者會再顯示一次標(biāo)簽間的文字,后者則繼續(xù)執(zhí)行標(biāo)簽處理的下一步。
EVAL_BODY_INCLUDE:把Body讀入存在的輸出流中,doStartTag()函數(shù)可用
EVAL_PAGE:繼續(xù)處理頁面,doEndTag()函數(shù)可用
SKIP_BODY:忽略對Body的處理,doStartTag()和doAfterBody()函數(shù)可用
SKIP_PAGE:忽略對余下頁面的處理,doEndTag()函數(shù)可用
EVAL_BODY_TAG:已經(jīng)廢止,由EVAL_BODY_BUFFERED取代
EVAL_BODY_BUFFERED:申請緩沖區(qū),由setBodyContent()函數(shù)得到的BodyContent對象來處理tag的body,如果類實現(xiàn)了BodyTag,那么doStartTag()可用,否則非法
EVAL_BODY_BUFFERED 要將BodyContent的內(nèi)容輸出 如:
JspWriter w = pageContext.getOut();
if (bodyContent != null) {
if (w instanceof BodyContent) {
w = ((BodyContent) w).getEnclosingWriter();
}
}
String cnt = this.bodyContent.getString();
try {
w.write(cnt);
} catch (IOException e) {
e.printStackTrace();
}
預(yù)定的處理順序是:doStartTag()返回SKIP_BODY,doAfterBodyTag()返回SKIP_BODY,doEndTag()返回EVAL_PAGE.
如果繼承了TagSupport之后,如果沒有改寫任何的方法,標(biāo)簽處理的執(zhí)行順序是:
doStartTag() ->不顯示文字 ->doEndTag()->執(zhí)行接下來的網(wǎng)頁
如果您改寫了doStartTag(),則必須指定返回值,如果指定了EVAL_BODY_INCLUDE,則執(zhí)行順序是
doStartTag()->顯示文字->doAfterBodyTag()->doEndTag()->執(zhí)行下面的網(wǎng)頁
display.tld 源碼
xml 代碼:
DisplayTag.java 源碼
java 代碼: