1?TagSupport與BodyTagSupport的區別
?TagSupport與BodyTagSupport的區別主要是標簽處理類是否需要與標簽體交互,如果不需要交互的就用TagSupport,否則如果不需要交互就用BodyTagSupport。
?????交互就是標簽處理類是否要讀取標簽體的內容和改變標簽體返回的內容。
????用TagSupport實現的標簽,都可以用BodyTagSupport來實現,因為BodyTagSupport繼承了TagSupport。
?2?doStartTag(),doEndTag()
???doStartTag()方法是遇到標簽開始時會呼叫的方法,其合法的返回值是EVAL_BODY_INCLUDE與SKIP_BODY,前者表示將顯示標簽間的文字,后者表示不顯示標簽間的文字;doEndTag()方法是在遇到標簽結束時呼叫的方法,其合法的返回值是EVAL_PAGE與?SKIP_PAGE,前者表示處理完標簽后繼續執行以下的JSP網頁,后者是表示不處理接下來的JSP網頁
????doAfterBody(),這個方法是在顯示完標簽間文字之后呼叫的,其返回值有EVAL_BODY_AGAIN與SKIP_BODY,前者會再顯示一次標簽間的文字,后者則繼續執行標簽處理的下一步。
???預定的處理順序是:doStartTag()返回SKIP_BODY,doAfterBodyTag()返回SKIP_BODY,doEndTag()返回EVAL_PAGE.
??如果繼承了TagSupport之后,如果沒有改寫任何的方法,標簽處理的執行順序是:
???doStartTag()?->不顯示文字?->doEndTag()->執行接下來的網頁
??如果您改寫了doStartTag(),則必須指定返回值,如果指定了EVAL_BODY_INCLUDE,則執行順序是
???doStartTag()->顯示文字->doAfterBodyTag()->doEndTag()->執行下面的網頁
?
下面這個程式簡單的示範如何使用自訂標籤來對網頁內容作一些保護:
????*?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設定為key,就顯示本體文字內容?
????????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>中設定的是JSP,這表示如果本體中包括JSP網頁的內容,將會被編譯執行,接下來您可以在web.xml中定義uri與.tld的名稱對應關係,方法與前一個主題相同,這邊就不重複說明了,然後撰寫一個測試的JSP網頁:
????*?test.jsp
<%@taglib?prefix="caterpillar"?
???????????uri="
<html>?
<body>?
????這個網頁包括受保護的內容OOOXXXX。。。。。。<p>?
????<caterpillar:guard>?
????????${?param.user?},?您好,幸運密碼是?oooxxx?!?
????</caterpillar:guard>?
</body>?
</html>?
為了要能看到幸運密碼,您必須在請求中包括guard參數,假設請求是:
http://localhost:8080/myjsp/test.jsp?valid=valid_user&user=Justin
這樣就可以看到幸運密碼了:
<html>
<body>
????這個網頁包括受包護的內容OOOXXXX。。。。。。<p>
???
????????Justin,?您好,幸運密碼是:?oooxxx?!
???
</body>
</html>
大盤預測
國富論
posted on 2007-09-11 10:09
華夢行 閱讀(721)
評論(1) 編輯 收藏