乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      帶有body的自定義tag的開發(fā)過程

       kunge 2007-01-17
      帶有body的自定義tag的開發(fā)過程


      今天學習帶body的自定義標簽,嘗試寫一個標簽,這個標簽可以迭代顯示標簽主體里面的內(nèi)容,迭代的次數(shù)由標簽的屬性指定.

            首先,要說明的是,其實標簽也是一個java類,它是運行一個或兩個接口的javabean,然后再配合標簽描述文件(以.tld為擴展名),兩者結合就可以作出自己的自定義標簽庫了.呵呵,是不是覺得有點眉目了?

            那么下面我們開始寫一個自己的java標簽類,作為有body的標簽,這個類必須實現(xiàn)javax.servlet.jsp.tagext.BodyTag接口.

            下面我們看一下BodyTag這個接口中定義了那些方法來支持tag:

          public void doInitBody();
          public void setBodyContent(javax.servlet.jsp.tagext.BodyContent);
          public int doAfterBody();

            那么由于BodyTag繼承了javax.servlet.jsp.tagext.Tag接口,所以我們再來看一下Tag中的方法:

          public void release();
          public javax.servlet.jsp.tagext.Tag getParent();
          public void setParent(javax.servlet.jsp.tagext.Tag);
          public int doEndTag();
          public int doStartTag();
          public void setPageContext(javax.servlet.jsp.PageContext);

            說了這么多方法,是不是有點頭暈了?呵呵,那么究竟BodyTag的處理過程是怎么樣的呢?下面我們就來說一下它的處理流程:

          1.當容器創(chuàng)建一個新的標簽實例后,通過setPageContext來設置標簽的頁面上下文.
          2.使用setParent方法設置這個標簽的上一級標簽,如果沒有上一級嵌套,設置為null.
          3.設置標簽的屬性,這個屬性在標簽庫描述文件中定義,如果沒有定義屬性,就不調(diào)用此類方法.
          4.調(diào)用doStartTag方法,這個方法可以返回EVAL_BODY_INCLUDE和SKIP_BODY,當返回EVAL_BODY_INCLUDE時,就計算標簽的body,如果返回SKIP_BODY,就不再計算標簽的body.
          5.調(diào)用setBodyContent設置當前的BodyContent.
          6.調(diào)用doInitBody,如果計算BodyContent時需要進行一些初始化,就在這個方法中進行.
          7.每次計算完Body后調(diào)用doAfterBody,如果返回EVAL_BODY_TAG,表示繼續(xù)計算一次Body,知道返回SKIP_BODY才繼續(xù)往下執(zhí)行.
          8.調(diào)用doEndTag方法,這個方法可以返回EVAL_PAGE或者SKIP_PAGE,當返回EVAL_PAGE時,容器將在標簽結束時繼續(xù)計算JSP頁面其他的部分;如果返回SKIP_PAGE,容器將在標簽結束時停止計算JSP頁面其他的部分.
          9.調(diào)用release()方法釋放標簽程序占用的任何資源。

            知道了標簽處理的流程了,那么下面我們就開始寫一個自己的java類了

            我的標簽類的源碼:

      1. package test.jsp.tags;
      2. import javax.servlet.jsp.tagext.BodyTagSupport;
      3. import javax.servlet.jsp.tagext.BodyContent;
      4. import javax.servlet.jsp.JspTagException;
      5. public class BodyTagExample
      6.     extends BodyTagSupport {
      7.   private int counts;
      8.   public BodyTagExample() {
      9.     super();
      10.   }
      11.   public void setCounts(int counts) {
      12.     this.counts = counts;
      13.   }
      14.   public int doStartTag() throws JspTagException {
      15.     System.out.println("doStartTag...");
      16.     if (counts > 0) {
      17.       return EVAL_BODY_TAG;
      18.     }
      19.     else {
      20.       return SKIP_BODY;
      21.     }
      22.   }
      23.   public void setBodyContent(BodyContent bodyContent) {
      24.     System.out.println("setBodyContent...");
      25.     this.bodyContent = bodyContent;
      26.   }
      27.   public void doInitBody() throws JspTagException {
      28.     System.out.println("doInitBody....");
      29.   }
      30.   public int doAfterBody() throws JspTagException {
      31.     System.out.println("do After body..." + counts);
      32.     if (counts > 1) {
      33.       counts--;
      34.       return EVAL_BODY_TAG;
      35.     }
      36.     else {
      37.       return SKIP_BODY;
      38.     }
      39.   }
      40.   public int doEndTag() throws JspTagException {
      41.     System.out.println("do end Tag...");
      42.     try {
      43.       if (bodyContent != null) {
      44.         bodyContent.writeOut(bodyContent.getEnclosingWriter());
      45.       }
      46.     }
      47.     catch (java.io.IOException e) {
      48.       throw new JspTagException("IO Error: " + e.getMessage());
      49.     }
      50.     return EVAL_PAGE;
      51.   }
      52. }


            寫完了java類,下面我們該用一個描述文件來描述我們寫的這個類了:

            我的tld描述文件源碼:

      <?xml version="1.0" encoding="ISO-8859-1" ?>
      <!DOCTYPE taglib
        PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"
        "http://java./j2ee/dtds/web-jsptaglibrary_1_1.dtd">
      <taglib>
        <tlibversion>1.0</tlibversion>
        <jspversion>1.1</jspversion>

        <shortname>Application Tag Library</shortname>
        <uri>http://jakarta./taglibs/struts-example-1.0</uri>
        <info>tag loop</info>

          <tag>
          <name>loop</name>
          <tagclass>test.jsp.tags.BodyTagExample</tagclass>
          <bodycontent>JSP</bodycontent>
          <attribute>
          <name>counts</name>
          <required>true</required>
          <rtexprvalue>true</rtexprvalue>
          </attribute>
         </tag>

      </taglib>

            我們對這個文件進行一個小小的說明:

            最重要的是上面的黑體字部分,其他的部分我們可以拷貝粘貼就可以了。

          tag中的name屬性:定義了我們的tag名稱,在后面會用到。
          tag中的tagclass屬性:指定了我們這個tag的實現(xiàn)類。
          tage中的bodycontent屬性:指定我們的頁面內(nèi)容是什么性質(zhì)的。(注意:在jsp開發(fā)中這里必須寫JSP)
          tage中的attribute屬性:定義了我們的這個tag可能有的屬性。

          attribute中的name屬性:指定了屬性的名稱。它和我們類中定義的“int counts;”必須一樣,并且在類中還必須包含一個setCounts(int counts)方法,否則這個屬性就不能設置。
          attribute中的required屬性:表示這個屬性是否是必須的。
          attribute中的rtexprvalue屬性:表示這個屬性是否可以用JSP的程序段的結果輸出。

            現(xiàn)在我們的tag就寫完了,下面就是我們怎么在頁面中用了。

            首先,我們要在web.xml中聲明這個tag

          我的web.xml源碼:

      1. <?xml version="1.0" encoding="UTF-8"?>
      2. <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java./dtd/web-app_2_3.dtd">
      3. <web-app>
      4.   <taglib>
      5.     <taglib-uri>demotag</taglib-uri>
      6.     <taglib-location>/WEB-INFtldmytag.tld</taglib-location>
      7.   </taglib>
      8. </web-app>

        
            其次,我們要在頁面中引用這個tag。

            我的jsp源碼:

      1. <%@ page contentType="text/html; charset=GBK" language="java"%>
      2. <%@ taglib uri="demotag" prefix="demo" %>
      3. <html>
      4. <body>
      5.     <br>
      6.     <demo:loop counts="5">
      7.         現(xiàn)在時間是:<%=new java.util.Date().toString()%><br>
      8.     </demo:loop>
      9.     <br>
      10. </body>
      11. </html>


            好了,一個tag就開發(fā)完了,下面是頁面的顯示結果:

      現(xiàn)在時間是:Thu Sep 22 12:33:31 CST 2005
      現(xiàn)在時間是:Thu Sep 22 12:33:31 CST 2005
      現(xiàn)在時間是:Thu Sep 22 12:33:31 CST 2005
      現(xiàn)在時間是:Thu Sep 22 12:33:31 CST 2005
      現(xiàn)在時間是:Thu Sep 22 12:33:31 CST 2005

            這里是后臺打出來的信息:

      doStartTag...
      setBodyContent...
      doInitBody....
      do After body...5
      do After body...4
      do After body...3
      do After body...2
      do After body...1
      do end Tag...

            一切OK了!

        本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
        轉藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多