1?TagSupport與BodyTagSupport的區(qū)別
?TagSupport與BodyTagSupport的區(qū)別主要是標(biāo)簽處理類是否需要與標(biāo)簽體交互,如果不需要交互的就用TagSupport,否則如果不需要交互就用BodyTagSupport。
?????交互就是標(biāo)簽處理類是否要讀取標(biāo)簽體的內(nèi)容和改變標(biāo)簽體返回的內(nèi)容。
????用TagSupport實(shí)現(xiàn)的標(biāo)簽,都可以用BodyTagSupport來實(shí)現(xiàn),因?yàn)锽odyTagSupport繼承了TagSupport。
?2?doStartTag(),doEndTag()
???doStartTag()方法是遇到標(biāo)簽開始時(shí)會(huì)呼叫的方法,其合法的返回值是EVAL_BODY_INCLUDE與SKIP_BODY,前者表示將顯示標(biāo)簽間的文字,后者表示不顯示標(biāo)簽間的文字;doEndTag()方法是在遇到標(biāo)簽結(jié)束時(shí)呼叫的方法,其合法的返回值是EVAL_PAGE與?SKIP_PAGE,前者表示處理完標(biāo)簽后繼續(xù)執(zhí)行以下的JSP網(wǎng)頁,后者是表示不處理接下來的JSP網(wǎng)頁
????doAfterBody(),這個(gè)方法是在顯示完標(biāo)簽間文字之后呼叫的,其返回值有EVAL_BODY_AGAIN與SKIP_BODY,前者會(huì)再顯示一次標(biāo)簽間的文字,后者則繼續(xù)執(zhí)行標(biāo)簽處理的下一步。
???預(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)頁
?
下面這個(gè)程式簡(jiǎn)單的示範(fàn)如何使用自訂標(biāo)籤來對(duì)網(wǎng)頁內(nèi)容作一些保護(hù):
????*?GuardTag.java
package?onlyfun.caterpillar;?
?
import?java.io.*;?
import?javax.servlet.jsp.*;?
import?javax.servlet.jsp.tagext.*;?
?
public?class?GuardTag?extends?TagSupport?{?
????public?int?doStartTag()?throws?JspException?{?
????????String?valid?=?
????????????pageContext.getRequest().getParameter("valid");?
?
????????//?如果flag設(shè)定為key,就顯示本體文字內(nèi)容?
????????if(valid.equals("valid_user"))?{?
????????????return?EVAL_BODY_INCLUDE;?
????????}?
?
????????return?SKIP_BODY;?
????}?
}?
同樣的,程式編譯完之後,放置在WEB-INF/classes/之下,然後編譯.tld檔案,如下:
????*?guardtag.tld
<?xml?version="1.0"?encoding="UTF-8"??>?
?
<taglib?xmlns="
????xmlns:xsi="
????xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
????????????????????????web-jsptaglibrary_2_0.xsd"?
????version="2.0">?
????
????<description>Tag?Demo</description>?
????<tlib-version>1.0</tlib-version>?
????<jsp-version>2.0</jsp-version>?
????<short-name>TagDemo</short-name>?
????<uri>/TagDemo</uri>?
????<tag>?
????????<description>Cuard?BodyText</description>?
????????<name>guard</name>?
????????<tag-class>onlyfun.caterpillar.GuardTag</tag-class>?
????????<body-content>JSP</body-content>?
????</tag>?
</taglib>?
在<body-content>中設(shè)定的是JSP,這表示如果本體中包括JSP網(wǎng)頁的內(nèi)容,將會(huì)被編譯執(zhí)行,接下來您可以在web.xml中定義uri與.tld的名稱對(duì)應(yīng)關(guān)係,方法與前一個(gè)主題相同,這邊就不重複說明了,然後撰寫一個(gè)測(cè)試的JSP網(wǎng)頁:
????*?test.jsp
<%@taglib?prefix="caterpillar"?
???????????uri="
<html>?
<body>?
????這個(gè)網(wǎng)頁包括受保護(hù)的內(nèi)容OOOXXXX。。。。。。<p>?
????<caterpillar:guard>?
????????${?param.user?},?您好,幸運(yùn)密碼是?oooxxx?!?
????</caterpillar:guard>?
</body>?
</html>?
為了要能看到幸運(yùn)密碼,您必須在請(qǐng)求中包括guard參數(shù),假設(shè)請(qǐng)求是:
http://localhost:8080/myjsp/test.jsp?valid=valid_user&user=Justin
這樣就可以看到幸運(yùn)密碼了:
<html>
<body>
????這個(gè)網(wǎng)頁包括受包護(hù)的內(nèi)容OOOXXXX。。。。。。<p>
???
????????Justin,?您好,幸運(yùn)密碼是:?oooxxx?!
???
</body>
</html>
大盤預(yù)測(cè)
國(guó)富論
posted on 2007-09-11 10:09
華夢(mèng)行 閱讀(721)
評(píng)論(1) 編輯 收藏