TagSupport與BodyTagSupport的區別
標簽: TagSupport與BodyTagSupport的區別
1、 TagSupport與BodyTagSupport的區別
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 代碼:
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
<taglib>
<tlibversion>1.0</tlibversion>
<jspversion>1.1</jspversion>
<shortname>bean</shortname>
<uri>/WEB-INF/tld/display.tld</uri>
<tag>
<name>display</name>
<tagclass>com.liuzhe.common.DisplayTag</tagclass>
<bodycontent>JSP</bodycontent>
<info>display content</info>
<attribute>
<name></name>
<required></required>
<rtexprvalue></rtexprvalue>
</attribute>
</tag>
</taglib>
DisplayTag.java 源碼
java 代碼:
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;
public class DisplayTag extends TagSupport {
private static final long serialVersionUID = 4540106083884185193L;
@Override
public int doStartTag() throws JspException {
System.out.println("doStartTag()");
return EVAL_BODY_INCLUDE;
}
@Override
public int doAfterBody() throws JspException {
System.out.println("doAfterBody()");
return SKIP_BODY;
}
@Override
public int doEndTag() throws JspException {
System.out.println("doEndTag()");
JspWriter out = this.pageContext.getOut();
try {
out.print("hello!");
} catch (IOException e) {
e.printStackTrace();
}
return super.doEndTag();
}
}
<%@ taglib uri="/WEB-INF/tld/display.tld" prefix="test" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<test:display>test<br></test:display>
</body>
</html>
注意:這里的“test” 顯示在 hello 前面證明啦 它是先執行index.jsp 中標簽中的內容后才執行doEndTag()