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

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

    • 分享

      Taglib 原理和實(shí)現(xiàn)之什么是Taglib

       Mr_Ren__ 2010-09-13

      Taglib 原理和實(shí)現(xiàn)之什么是Taglib

        1、問題:Tag究竟是什么?如何實(shí)現(xiàn)一個(gè)Tag?

        一個(gè)tag就是一個(gè)普通的java類,它唯一特別之處是它必須繼承TagSupport或者BodyTagSupport類。這兩個(gè)類提供了一些方法,負(fù)責(zé)jsp頁面和你編寫的類之間的交互,例如輸入,輸出。而這兩個(gè)類是由jsp容器提供的,無須開發(fā)人員自己實(shí)現(xiàn)。換句話說,你只需把實(shí)現(xiàn)了業(yè)務(wù)邏輯的類繼承TagSupport或者BodyTagSupport,再做一些特別的工作,你的類就是一個(gè)Tag。并且它自己負(fù)責(zé)和jsp頁面的交互,不用你多操心。

        “特別的工作”通常有以下幾個(gè)步驟:

        1)提供屬性的set方法,此后這個(gè)屬性就可以在jsp頁面設(shè)置。以jstl標(biāo)簽為例 <c:out value=""/>,這個(gè)value就是jsp數(shù)據(jù)到tag之間的入口。所以tag里面必須有一個(gè)setValue方法,具體的屬性可以不叫value。例如

      setValue(String data){this.data = data;}

        這個(gè)“value”的名稱是在tld里定義的。取什么名字都可以,只需tag里提供相應(yīng)的set方法即可。

        2)處理 doStartTag 或 doEndTag 。這兩個(gè)方法是 TagSupport提供的。 還是以<c:out value=""/>為例,當(dāng)jsp解析這個(gè)標(biāo)簽的時(shí)候,在“<”處觸發(fā) doStartTag 事件,在“>”時(shí)觸發(fā) doEndTag 事件。通常在 doStartTag 里進(jìn)行邏輯操作,在 doEndTag 里控制輸出。

        3)編寫tld文件。

        4)在jsp頁面導(dǎo)入tld

        這樣,你的jsp頁面就可以使用自己的tag了。

        通常你會(huì)發(fā)現(xiàn)自己絕大多數(shù)活動(dòng)都集中在 doStartTag 或 doEndTag 方法里。確實(shí)如此,熟悉一些接口和類之后,寫taglib很容易。正如《jsp設(shè)計(jì)》的作者所言:里面的邏輯稍微有點(diǎn)復(fù)雜,但畢竟沒有火箭上天那么難。

        2、一個(gè)簡(jiǎn)單的例子:OutputTag

      package diegoyun;
      import javax.servlet.jsp.JspException;
      import javax.servlet.jsp.JspWriter;
      import javax.servlet.jsp.tagext.TagSupport;
      /**
      * @author chenys
      */
      public class OutputTag extends TagSupport
      {
      private String name=null;
      public void setName(String name)
      {
      this.name = name;
      }

      public int doStartTag() throws JspException{
      try
      {
      JspWriter out = pageContext.getOut();
      out.print("Hello! " + name);
      }
      catch (Exception e)
      {
      throw new JspException(e);
      }
      return EVAL_PAGE;
      }
      }

        簡(jiǎn)要說明:

        1、如何輸出到j(luò)sp頁面:

        調(diào)用JspWriter JspWriter out = pageContext.getOut();out.print......

        記住這個(gè)方法就可以了。

        2、輸出后如何作處理

        函數(shù)會(huì)返回幾個(gè)值之一。EVAL_PAGE 表示tag已處理完畢,返回jsp頁面。還有幾個(gè)值,例如 EVAL_BODY_AGAIN 和EVAL_BODY_INCLUDE等,后面我們會(huì)作討論

        編寫tld

      <?xml version="1.0" encoding="ISO-8859-1" ?>
      <!DOCTYPE taglib
      PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
      "http://java./dtd/web-jsptaglibrary_1_2.dtd">
      <taglib>
      <tlib-version>1.0</tlib-version>
      <jsp-version>1.2</jsp-version>
      <short-name>diego</short-name>
      <!--OutputTag-->
      <tag>
      <name>out</name>
      <tag-class>diegoyun.OutputTag</tag-class>
      <body-content>empty</body-content>
      <attribute>
      <name>name</name>
      <required>false</required>
      <rtexprvalue>false</rtexprvalue>
      </attribute>
      </tag>
      </taglib>

        在WEB-INF下新建tlds文件夾,把這個(gè)文件取名為diego.tld,放到tlds文件夾下。路徑應(yīng)該這樣:WEB-INF\tlds\diego.tld
      關(guān)于tld的簡(jiǎn)單說明:

        short-name:taglib的名稱,也稱為前綴。比如<c:out value=""/> 里的“c”

        name:tag的名字。例如<c:out value=""/> 里的"out”,我們的類也取名為out,由于有前綴作區(qū)分,不會(huì)混淆

        tag-class:具體的tag類。帶包名

        body-content:指tag之間的內(nèi)容。例如<c:out value=""> ...... </c> 起始和關(guān)閉標(biāo)簽之間就是body-content。由于沒有處理body-content,所以上面設(shè)為empty

        <attribute>里的name:屬性名字。例如<c:out value=""/>里的value。名字可任意取,只要類里提供相應(yīng)的set方法即可。

        required:是否必填屬性。

        rtexprvalue:是否支持運(yùn)行時(shí)表達(dá)式取值。這是tag的強(qiáng)大功能。以后我們會(huì)討論。暫時(shí)設(shè)為false

        編寫jsp頁面

      <%@ page language="java"%>
      <%@ taglib uri="/WEB-INF/tlds/diego.tld" prefix="diego"%>
      <html>
      <body>
      Test Tag:
      <diego:out name="diegoyun"/>
      </body>
      </html>

        我的編程環(huán)境是eclipse+tomcat.啟動(dòng)服務(wù)器,如果一切按照上面步驟的話,就能看到 Test Tag: Hello! diegoyun 字樣

        最簡(jiǎn)單的tag就這么出來了。并不難,是不是?

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

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多