JSP自訂標籤學習(進階)

來源:互聯網
上載者:User

 

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 代碼 

  1. import java.io.IOException;  
  2.   
  3. import javax.servlet.jsp.JspException;  
  4. import javax.servlet.jsp.tagext.BodyTagSupport;  
  5.   
  6. public class PrintBodyTag extends BodyTagSupport {  
  7.     public int doAfterTag()throws JspException  
  8.     {  
  9.         try  
  10.         {         
  11.             this.getBodyContent().writeOut(getPreviousOut());//上面講的理論!  
  12.         }catch(IOException e)  
  13.         {  
  14.             throw new JspException(e);  
  15.         }  
  16.         return SKIP_BODY;  
  17.     }  
  18. }  

部署tld檔案xml 代碼 

  1. ......  
  2.   <tag>  
  3.     <name>printBody</name>  
  4.     <tag-class>PrintBodyTag</tag-class>  
  5.       
  6.   </tag>  
  7.   ......  
頁面載入:
html代碼 
  1. <%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>  
  2. <%@ taglib uri="http://www.eimhe.com/taglibs/util.tld" prefix="util"%>  
  3. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  4. <html>  
  5.   <head>  
  6.     <title>My JSP 'tag.jsp' starting page</title>  
  7.   </head>  
  8.   <body>  
  9.     <util:printBody>AAAAAAAA</util:printBody> //結果就是怎麼樣相信大家猜得到!AAAAAAAA  
  10.   </body>  
  11. </html>  

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.