posts - 93,  comments - 2,  trackbacks - 0

          首先標簽是一個java類,它是運行一個或兩個接口的javabean,然后再配合標簽描述文件(以.tld為擴展名),兩者結合就可以作出自己的自定義標簽庫了。

          自定義標簽必須實現下面三個接口中的一個:Tag、IterationTag、BodyTag 

           

          Tag接口中的返回常數意義:
          EVAL_BODY_INCLUDE:告訴服務器正文的內容,并把這些內容送入輸出流
          SKIP_BODY:告訴服務器不要處理正文內容
          EVAL_PAGE:讓服務器繼續執行頁面
          SKIP_PAGE:讓服務器不要處理剩余的頁面
          EVAL_BODY_AGAIN:讓服務器繼續處理正文內容,只有doAfterBody方法可以返回
          EVAL_BODY_BUFFERED:BodyTag接口的字段,在doStartTag()返回
          EVAL_BODY_INCLUDE、SKIP_BODY一般由doStartTag()返回,而EVAL_PAPGE、SKIP_PAGE由doEndTag()返回。

           

          一個擴展BodyTagSupport的自定義標記的生命周期如下:
          1.創建標記
          2.調用Setter方法
          3.調用doStartTag()方法
          4.調用setBodyContent()方法
          5.調用InitBody()方法
          6.處理標記的Body
          7.doAfterBody();根據返回值,如果為EVAL_BODY_AGAIN,繼續執行6,如果不是,執行8
          8.調用doEndTag()方法
          9.判斷標記是否需要重用,如果要,執行4;否則執行release()方法。

           

          標簽類代碼:

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

          tld描述文件源碼:

           

          Java代碼 復制代碼 收藏代碼
          1. <?xml version="1.0" encoding="ISO-8859-1" ?>   
          2. <!DOCTYPE taglib   
          3. PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"  
          4. "   
          5. http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">   
          6. <taglib>   
          7. <tlibversion>1.0</tlibversion>   
          8. <jspversion>1.1</jspversion>   
          9. <shortname>Application Tag Library</shortname>   
          10. <uri>http://jakarta.apache.org/taglibs/struts-example-1.0</uri>   
          11. <info>tag loop</info>   
          12. <tag>   
          13. <name>loop</name>   
          14. <tagclass>test.jsp.tags.BodyTagExample</tagclass>   
          15. <bodycontent>JSP</bodycontent>   
          16. <attribute>   
          17. <name>counts</name>   
          18. <required>true</required>   
          19. <rtexprvalue>true</rtexprvalue>   
          20. </attribute>   
          21. </tag>   
          22. </taglib>  

           

          其中:

          tag中的name屬性:定義了我們的tag名稱,在后面會用到。
          tag中的tagclass屬性:指定了我們這個tag的實現類。
          tage中的bodycontent屬性:指定我們的頁面內容是什么性質的。(注意:在jsp開發中這里必須寫JSP)
          tage中的attribute屬性:定義了我們的這個tag可能有的屬性。
          attribute中的name屬性:指定了屬性的名稱。它和我們類中定義的“int counts;”必須一樣,并且在類中還必須包含一個setCounts(int counts)方法,否則這個屬性就不能設置。
          attribute中的required屬性:表示這個屬性是否是必須的。
          attribute中的rtexprvalue屬性:表示這個屬性是否可以用JSP的程序段的結果輸出。


          tag寫完自后要在web.xml中聲明這個tag

          web.xml代碼如下:

           

          Java代碼 復制代碼 收藏代碼
          1. <?xml version="1.0" encoding="UTF-8"?>    
          2. <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">    
          3. <web-app>    
          4. <taglib>    
          5. <taglib-uri>demotag</taglib-uri>    
          6. <taglib-location>/WEB-INF/tld/mytag.tld</taglib-location>    
          7. </taglib>    
          8. </web-app>   

           

          Jsp引用代碼:

           

          Java代碼 復制代碼 收藏代碼
          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. 現在時間是:<%=new java.util.Date().toString()%><br>    
          8. </demo:loop>    
          9. <br>    
          10. </body>    
          11. </html>   

          posted on 2012-03-26 17:44 Terry Zou 閱讀(213) 評論(0)  編輯  收藏 所屬分類: struts2.1.6

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          常用鏈接

          留言簿(2)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          相冊

          收藏夾

          Java

          搜索

          •  

          最新隨筆

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 司法| 三穗县| 万州区| 甘肃省| 镇江市| 承德市| 东丽区| 德格县| 廊坊市| 达州市| 乳源| 安泽县| 永清县| 彩票| 永宁县| 赤城县| 西乌| 景洪市| 祁连县| 聂荣县| 新余市| 西贡区| 鱼台县| 彭州市| 依兰县| 玛曲县| 双城市| 彭阳县| 凤城市| 米泉市| 通化县| 马公市| 鄂托克前旗| 娱乐| 万安县| 兴山县| 达孜县| 九龙坡区| 峨山| 喀什市| 新和县|