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