日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

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

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


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

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

      那么下面我們開始寫一個自己的java標(biāo)簽類,作為有body的標(biāo)簽,這個類必須實(shí)現(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);

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

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

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

      我的標(biāo)簽類的源碼:

  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>

      我們對這個文件進(jìn)行一個小小的說明:

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

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

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

      現(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)在時(shí)間是:<%=new java.util.Date().toString()%><br>
  8.     </demo:loop>
  9.     <br>
  10. </body>
  11. </html>


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

現(xiàn)在時(shí)間是:Thu Sep 22 12:33:31 CST 2005
現(xiàn)在時(shí)間是:Thu Sep 22 12:33:31 CST 2005
現(xiàn)在時(shí)間是:Thu Sep 22 12:33:31 CST 2005
現(xiàn)在時(shí)間是:Thu Sep 22 12:33:31 CST 2005
現(xiàn)在時(shí)間是: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)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多