JSP自訂標籤學習(進階)
關鍵字: 自訂標籤
BodyTag介面
介面BodyTag的實作類別,它是負責操作主體內容(bodyContent).
定義方法:public void doInitBody();
public int doAtferBody();
提示,那些在doStartTag()方法之後被調用的方法依賴於doStartTag()方法傳回值並且看在JSP頁面上是否自訂Action元素,而不是怎樣在TLD檔案中去申明
在TLD檔案中, 若<body-content>empty</body-content>的話,doStartTag()方法只能返回SKIP_BODY
body-content有三個可選值:empty , JSP , tagdependent
若沒有設定的話,那麼doStartTag()可以返回SKIP_BODY, EVAL_BODY_INCLUDE, or EVAL_BODY_BUFFERED.
傳回值的說明:
若SKIP_BODY返回的情況下,body不會被evaluated並且doEndTag()被調用;
若EVAL_BODY_INCLUDE 返回,並且自訂action元素不為空白的時候,那麼doInitBody(),setBodyContent()不會被調用,而body evaluated並且"通過"當前的out對象,還有當action元素為空白的時候,只有doStartTag(),doEndTag();
當EVAL_BODY_BUFFERED 返回,並且自訂的action元素不為空白的時候,setBodyContent(),doInitBody()被調用,body被evaluated,doAfterBody()被調用,直到大於0次迭代後,doEndTag()才被調用,還有當action元素為空白的時候,只有doStartTag(),doEndTag();
主題內容
1.自訂標籤通常需要操控自己的主體內容,例如資料庫查詢需要將其主題內容解釋為SQL
2.工作方法
servlet容器包含BodyContent對象棧,servlet容器在doStartTag()方法之後調用PageContext.pushBody(),就是說把當前的主體內容推入棧中,其中out變數重新導向到當前的主體內容執行個體主題內容,保留一個到JspWriter對象的引用,即前一個輸出,JspWriter將資料寫入響應流中.這樣就有效地建立了寫入器棧
servlet容器是在調用標記的doAfterBody和doEndTag方法之間調用PageContent.popBody()方法的
注意請不要在doEndTag()後面去訪問BodyContent,因為servlet容器在調用標記處理常式的doEndTag()方法為止,servlet容器可能已經再次使用了該標記的主題內容,使用doEndTag方法訪問自己主體內容的標記,可能會訪問到其他標記的主體內容,或者可能訪問到空值,這樣就導致了不確定的行為
BodyTagSupport類,實現BodyTag介面的類
public BodyContent getBodyContent();//返回主題內容
public JspWriter getPreviousOut();//返回前一個out對象
說了這麼一大堆的東西,有什麼用呢?我們來寫個東西來說明以下:
列印出主體內容!java 代碼
- import java.io.IOException;
-
- import javax.servlet.jsp.JspException;
- import javax.servlet.jsp.tagext.BodyTagSupport;
-
- public class PrintBodyTag extends BodyTagSupport {
- public int doAfterTag()throws JspException
- {
- try
- {
- this.getBodyContent().writeOut(getPreviousOut());//上面講的理論!
- }catch(IOException e)
- {
- throw new JspException(e);
- }
- return SKIP_BODY;
- }
- }
部署tld檔案xml 代碼
- ......
- <tag>
- <name>printBody</name>
- <tag-class>PrintBodyTag</tag-class>
-
- </tag>
- ......
頁面載入:
html代碼
- <%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
- <%@ taglib uri="http://www.eimhe.com/taglibs/util.tld" prefix="util"%>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <title>My JSP 'tag.jsp' starting page</title>
- </head>
- <body>
- <util:printBody>AAAAAAAA</util:printBody> //結果就是怎麼樣相信大家猜得到!AAAAAAAA
- </body>
- </html>