<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Dict.CN 在線詞典, 英語學(xué)習(xí), 在線翻譯

    都市淘沙者

    荔枝FM Everyone can be host

    統(tǒng)計

    留言簿(23)

    積分與排名

    優(yōu)秀學(xué)習(xí)網(wǎng)站

    友情連接

    閱讀排行榜

    評論排行榜

    標(biāo)簽庫的深入研究

    標(biāo)簽庫Taglib

    標(biāo)簽被定義和分布在一個稱為標(biāo)簽庫的結(jié)構(gòu)中,一個標(biāo)簽庫是由元信息和類組成的集合:
    1.標(biāo)簽處理器:實現(xiàn)定制標(biāo)簽功能的Java類。
    2.標(biāo)簽附加信息(TEI):向JSP容器提供邊輯以確認(rèn)標(biāo)簽屬性和創(chuàng)建變量的類。
    3.標(biāo)簽庫描述器(TLD):描述單個標(biāo)簽和整個標(biāo)簽庫屬性的XML文檔。

    標(biāo)簽處理器和標(biāo)簽附加信息需要定位在JSP容器類載入器可以找到的地方。標(biāo)簽庫描述器可在URL指定的符意位置。JSP1.1規(guī)范要求JSP容器接受一個打包成因定結(jié)構(gòu)的JAR文件的標(biāo)簽庫。TLD必須是/META-INF目錄中名為taglib.tld的文件,JAR文件則復(fù)制到/WEB-INF/lib目錄下。

    一、標(biāo)簽實現(xiàn)

    1.開發(fā)步驟
    a.定義標(biāo)簽的名字、屬性、聲明的變量和標(biāo)簽體的內(nèi)容。
    b.編寫標(biāo)簽庫描述器TLD。
    c.編寫標(biāo)簽處理器。
    d.在JSP頁面中使用標(biāo)簽。

    2.JSP頁面在JSP容器中的轉(zhuǎn)換步驟:
    JSP頁面存在三種形式:jsp文件、java文件和class文件。
    a.指令元素<%@page%>、<%@include%>和<%@taglib%>向JSP容器提供轉(zhuǎn)換時信息。
    b.HTML行在_jspService()方法中依順序轉(zhuǎn)換到out.print()語名中。
    c.腳本元素的聲明被原封不動地復(fù)制到_jspService()方法外的源碼中。
    d.腳本元素的表達(dá)式在_jspService()方法中依順序轉(zhuǎn)換到out.print()語名中。
    e.腳本元素的Scriptlet被原封不動地復(fù)制到_jspService()方法中。
    f.行為元素被轉(zhuǎn)換為執(zhí)行其功能的運行時邏輯代碼。
    g.定制標(biāo)簽被擴(kuò)展到調(diào)用其相應(yīng)標(biāo)簽處理器中方法的Java語句中。

    3.標(biāo)簽在JSP容器中的轉(zhuǎn)換步驟:
    a.JSP容器使用taglib指令元素定位標(biāo)簽庫描述器,將頁面中用到的定制標(biāo)簽和TLD相匹配。
    b.讀取標(biāo)簽庫描述器的標(biāo)簽列表和每一標(biāo)簽相關(guān)的類名字。
    c.在頁面中遇到一個標(biāo)簽時,查找與具有指定名字的標(biāo)簽前綴相關(guān)的一個標(biāo)簽庫。
    d.容器使用在TLD中找到的標(biāo)簽結(jié)構(gòu)信息生成一系列完成標(biāo)簽功能的Java語句。


    二、標(biāo)簽庫描述器(TLD)

    標(biāo)簽庫描述器是一個描述整個標(biāo)簽庫標(biāo)記信息和庫中每個標(biāo)簽處理器及其屬性的XML文檔。

    標(biāo)簽庫描述器的DTD由一個簡單的<taglib>元素組成,此元素包含下列一些子元素。
    整個標(biāo)簽庫標(biāo)記信息
    tlibversion????標(biāo)簽庫版本號。是一個點式十進(jìn)制數(shù),最多為4組小數(shù)點分隔的數(shù)字組成。
    jspversion????標(biāo)簽庫所需的JSP規(guī)范最低版本。例如JSP1.1
    shortname????標(biāo)簽庫的縮寫名。JSP可以使用該名字作為庫中標(biāo)簽的缺省前綴。
    uri????標(biāo)簽庫唯一URI的元素。典型URL位置來自可下載taglib的位置。
    info????標(biāo)簽庫描述信息。
    每個標(biāo)簽處理器及其屬性
    tag????在TLD中加入標(biāo)簽,描述組成庫的每個標(biāo)簽。
    name????與標(biāo)簽庫的名字前綴一起使用的標(biāo)簽的名字,?是JSP容器唯一的標(biāo)簽標(biāo)識。
    tagclass????實現(xiàn)標(biāo)簽的標(biāo)簽處理器類的全名。
    teiclass????標(biāo)簽附加信息(TEI)類的全名。TEI類給出關(guān)于標(biāo)簽處理器創(chuàng)建變量及對標(biāo)簽司性執(zhí)行的任意有效性驗證的信息。
    bodycontent????描述標(biāo)簽處理器如何使用標(biāo)簽體的內(nèi)容。有三種取值:
    ????empty:表示標(biāo)簽體必須為空;
    ????JSP:表示腳本元素和模板及其它標(biāo)簽一樣被評估。
    ????tagdependent:體內(nèi)容被原封不動寫入BodyContent,其它腳本元素以源碼形式出現(xiàn),而不被JSP容器解釋。
    info????標(biāo)簽的人工可讀描述性信息。
    attribute????使用標(biāo)簽時被編碼的屬性信息。用于定義標(biāo)簽的屬性。
    ????<name>屬性名</name>:屬性的名字。
    ????<request>true|false</request>:屬性在標(biāo)簽用到的位置是否要被編碼。
    ????<rtxexpvalue>true|false</rtxexpvalue>:屬性值能否用表達(dá)式指定。

    三、標(biāo)簽處理器

    標(biāo)簽處理器是通過實現(xiàn)JSP容器調(diào)用的一系列預(yù)定義方法執(zhí)行定制標(biāo)簽行為的一個Java類。
    標(biāo)簽處理器實現(xiàn)了標(biāo)簽的行為,標(biāo)簽處理器是Java類。

    1.標(biāo)簽處理器的工作方式
    a.導(dǎo)入javax.servlet.jsp和javax.servlet.jsp.tagext包。
    b.實現(xiàn)javax.servlet.jsp.tagext包中的Tag接口或BodyTag接口。BodyTag是Tag的子接口。
    c.繼承TagSupport類或BodyTagSuppoert類。它們是上述接口的缺省實現(xiàn)。
    d.重載public?int?doStartTag()throws?JspException方法。

    2.標(biāo)簽處理器的接口與實現(xiàn)
    javax.servlet.jsp.tagext.Tag是實現(xiàn)標(biāo)簽的最基本的接口。
    javax.servlet.jsp.tagext.TagSupport是實現(xiàn)Tag接口的具體類。
    通常情況下繼承tagSupport類而不直接實現(xiàn)Tag接口通常是有益的。除了對所有必需方法提供了缺省實現(xiàn)外、還保存了pageContext對象及對嵌套標(biāo)簽的支持。
    Tag接口包含4個常量,表示doStartTag()和doEndTag()方法可能的返回碼。
    EVAL_BODY_INCLUDE????當(dāng)doStartTag()返回時,指明servlet應(yīng)對標(biāo)簽體進(jìn)行評估。
    SKIP_BODY????當(dāng)doStartTag()返回時,指明servlet應(yīng)忽視標(biāo)簽體。
    EVAL_PAGE????當(dāng)doEndTag()返回時,指明頁面其余部分應(yīng)被評估。
    SKIP_PAGE????當(dāng)doEndTag()返回時,指明頁面其余部分就被跳過。
    Tag接口的方法
    public?void?setPageContext?(PageContext?ctx)????生成的servlet在請求處理器執(zhí)行其它任務(wù)前首先調(diào)用此方法,實現(xiàn)類應(yīng)保存上下文對象以便它可以在標(biāo)簽生命期中使用。從頁面上下文中標(biāo)簽處理器可以訪問所有JSP隱含對象。
    public?void?setParent(Tag?p)????使用一個標(biāo)答可以找到操作棧中它上面的標(biāo)簽。在setPageContext后立即調(diào)用。
    public?Tag?getParent()????返回父標(biāo)簽。
    public?int?doStartTag()?throws?Jsp????在設(shè)置了頁面上下文、父標(biāo)簽和開始標(biāo)記中編碼的屬性后調(diào)用。返回碼表明JSP實現(xiàn)servlet是否就評估標(biāo)簽體。
    public?int?doEndTag()throws?JspException????當(dāng)遇到結(jié)否標(biāo)記時調(diào)用。返回碼表明JSP是否就繼紐頁面的其余部份。
    public?void?release()????確保在頁面退出前被調(diào)用。釋放資源并重置標(biāo)簽處理器狀態(tài)。
    TagSupport類的方法
    public?static?Tag?finAncestorWithClass(Tag?thisTag,?Class?cls)????為所需的父標(biāo)簽處理器查找運行時標(biāo)簽棧。一個標(biāo)簽處理器可以提供其范圍內(nèi)子標(biāo)簽調(diào)用的方法。
    public?void?setId(String?id)????保存和檢索在id屬性中指定的名字。
    public?void?setValue(String?name,?Object?o)????在本地哈希表中設(shè)置指定名字的值。
    public?Object?getValue?(String?name)????從本地哈希表中獲取指定名稱的值。
    public?void?removeValue?(String?name)????從本地哈希表中刪除指定名稱的值。
    public?Enumeration?getValues()????返回哈希表中關(guān)鍵字的一個枚舉。

    3.標(biāo)簽處理器的生命期
    a.生成servlet需要創(chuàng)建標(biāo)簽處理器類的一個實例。實現(xiàn)方式通常是調(diào)用JSP容器的工廠類的一個方法,工廠類包含一個標(biāo)簽處理器實例池以使其可重用不再處于激活狀態(tài)的對象。
    b.初始化標(biāo)簽處理器,使servlet獲知其存在性。servlet通過調(diào)用標(biāo)簽處理器的兩個方法實現(xiàn)此過程:setPageContext(PageContext?ctx)和setParent(Tag?parent)。
    c.如果標(biāo)簽具有屬性,屬性的取值通過處理器提供setter方法傳入到對象。屬性setter方法是一個標(biāo)簽支持屬性所需的唯一方法。
    d.頁面的上下文和父標(biāo)簽已被調(diào)置,并已具備屬性。此時調(diào)用標(biāo)簽處理器的doStartTag()方法,該方法可以讀取這些變量并執(zhí)行實現(xiàn)標(biāo)答功能所需的計算和操作。doStartTag()方法必須返回一個整型數(shù)。返回EVAL_BODY_INCLUDE則正常處理標(biāo)簽體,返回SKIP_BODY則從初始JSP頁面中直到此標(biāo)簽結(jié)束標(biāo)記處的內(nèi)容均被忽略。
    e.標(biāo)簽體被評估或忽視后調(diào)用標(biāo)簽處理器的doEndTag()方法,返回EVAL_PAGE則頁面的其余部分被評估,返回SKIP_PAGE則servlet代碼立即從_jspService()中返回。

    4.體標(biāo)簽處理器的接口與實現(xiàn)
    javax.servlet.jsp.tagext.BodyTag是Tag的子接口。
    javax.servlet.jsp.tagext.BodyTagSupport是實現(xiàn)BodyTag類。
    BodyContent是javax.servlet.jsp.JspWriter的子類,但與其父類有所區(qū)別。
    BodyContent對象的內(nèi)容不自動寫了入servlet的輸出流,而是積累在一字符串緩存中。當(dāng)標(biāo)簽體完成后其對象仍可在doEndTag()方法中可以應(yīng)用,由getString()或getReader()方法操作。并在必要時修改及寫入恢復(fù)的JspWriter輸出流。
    BodyContent類的方法
    public?void?flush()throws?IOException????復(fù)寫JspWrite.flush()方法以便它總是產(chǎn)生溢出。刷新寫入已失效,因為它沒有連接到將被寫入的實際輸出流中。
    public?void?clearBody()????重置BodyContent緩存為空。
    public?Reader?getReader()????返回Reader讀取體內(nèi)容。
    public?String?getString()????返回包含體內(nèi)容的一個字符串。
    public?void?writeOut(Write?w)????將體內(nèi)容寫入指定輸出。
    public?JspWrite?getEnclosing?Write()????返回棧中下一個更高的寫入者對象(可能是另一個BodyContent對象)。
    BodyTag接口定義了一個新的整型常量
    EVAL_BODY_TAG????當(dāng)doStartTag()返回時,使得新的BodyContent對象被創(chuàng)建并與此標(biāo)簽處理器相關(guān)聯(lián)。當(dāng)doAfterBody()返回時,使得JSP?servlet在修改完此標(biāo)簽控制的任意變量后再次評估體。
    BodyTag接口的方法
    public?void?setBodyContern?(BodyContent?out)????在當(dāng)前JspWriter已被寫入,一個新的BodyContent在被創(chuàng)建后由Jsp?servlet調(diào)用,它發(fā)生在doStartTag()之后。
    public?void?doInitBody()?throws?JspException????setBodyContent()之后,體被評估前調(diào)用的生命期方法。如果多次評估體,此方法只調(diào)用一次。
    public?init?doAfterBody()?throws?JspException????體被評估后,BodyContent寫入者仍處于激活狀態(tài)時調(diào)用的生命期方法。此方法必須返回EVAL_BODY_TAG或SKIP_BODY,若返回EVAL_BODY_TAG時體再次被評估。
    BodyTagSupport類的方法
    public?int?doStartTag()?throws?JspException????復(fù)寫TagSupport中的doStartTag()方法。
    public?int?doEndTag()?throws?JspException????調(diào)用TagSupport中的doEndTag()方法,返回結(jié)果。
    public?void?setBodyContent?(BodyContent?out)????在一保護(hù)成員變量bodyContent中保存新的體內(nèi)容對象,子類可直接訪問此對象。
    public?void?doInitBody()?throws?JspException????缺省什么都不做。被需要執(zhí)行初始化的子類所復(fù)寫。
    public?int?doAfterBody()?throws?JspException????每次體被評估后由JSP?servlet調(diào)用,體同容對象仍處于激活狀態(tài)。返回SKEP_BODY或EVAL_BODY_TAG則體再次被評估
    public?void?release()????設(shè)置bodyContent對象為null,然后調(diào)用super.release()。
    public?BodyContent?getBodyContent()????返回bodyContent變量。子類已經(jīng)可以訪問保護(hù)變量,但此方法允許無關(guān)的標(biāo)簽處理類對此體內(nèi)容發(fā)送輸出。
    public?JspWriter?getPreviousOut()????在bodyContent變量上調(diào)用getEnclosingWriter()并返回結(jié)果的簡便方法。

    5.體標(biāo)簽處理器的生命期

    a.生成servlet需要創(chuàng)建標(biāo)簽處理器類的一個實例。實現(xiàn)方式通常是調(diào)用JSP容器的工廠類的一個方法,工廠類包含一個標(biāo)簽處理器實例池以使其可重用不再處于激活狀態(tài)的對象。
    b.初始化標(biāo)簽處理器,使servlet獲知其存在性。servlet通過調(diào)用標(biāo)簽處理器的兩個方法實現(xiàn)此過程:setPageContext(PageContext?ctx)和setParent(Tag?parent)。
    c.如果標(biāo)簽具有屬性,屬性的取值通過處理器提供setter方法傳入到對象。屬性setter方法是一個標(biāo)簽支持屬性所需的唯一方法。
    d.頁面的上下文和父標(biāo)簽已被調(diào)置,并已具備屬性。調(diào)用標(biāo)簽處理器的doStartTag()方法,該方法可以讀取這些變量并執(zhí)行實現(xiàn)標(biāo)答功能所需的計算和操作。
    doStartTag()方法必須返回一個整型數(shù)。
    返回EVAL_BODY_TAG則正常處理標(biāo)簽體(跳到e);
    返回SKIP_BODY則從初始JSP頁面中直到此標(biāo)簽結(jié)束標(biāo)記處的內(nèi)容均被忽略。(跳到f)
    e.如果返回EVAL_BODY_TAG時,則正常處理標(biāo)簽體。
    ????e1.在棧中保存當(dāng)前的JspWriter對象,創(chuàng)建新的BodyContent對象,并將其置為JSP頁面的out對象保存在上下文范圍內(nèi)名為name的屬性中。并調(diào)用它的setBodyContent()方法。
    ????e2.調(diào)用doInitBody()方法進(jìn)行初始化。
    ????e3.處理標(biāo)簽體。將輸出寫入BodyContent對象中,此過程依賴于TLD的標(biāo)簽元素<bodycontent>,有三種可能取值。
    ????e4.調(diào)用doAfterBody()方法,將體內(nèi)體內(nèi)容寫入JspWriter,可如下實現(xiàn):
    JspWriter?out=bodyContent.getEnclosingWriter();
    out.println(bodyContent.getString());//bodyContent.writeOut(out);
    bodyContent.clear();
    ????e5.doAfterBody()方法返回兩種可能:
    返回EVAL_BODY_TAG時,再對標(biāo)簽體進(jìn)行評估,這是數(shù)組和枚舉被循環(huán)處理的典型情況。
    ????返回SKIP_PAGE時,繼續(xù)頁面的其余部份。
    e6.體內(nèi)容完成,因此創(chuàng)建它的過程被反向:
    ????調(diào)用pageContent.popBody()方法檢索前面的JspWriter對象。
    ????將寫入者設(shè)置回out隱含對象。
    f.標(biāo)簽體被評估或忽視后調(diào)用doEndTag()方法,允許標(biāo)簽處理器像輸出流發(fā)回內(nèi)容。
    返回EVAL_PAGE則頁面的其余部分被評估;
    返回SKIP_PAGE則servlet代碼立即從_jspService()中返回。
    g.?此時體的內(nèi)容在受保護(hù)的bodyContent對象中仍然可用。
    可以將它寫入servlet輸出流中:
    JspWriter?out=pageContext.getOut();
    out.println(bodyContent.getString());
    或者
    bodyContent.WriteOut(pageContext.getOut());

    6.標(biāo)簽附加信息類


    四、標(biāo)簽指令

    taglib指令元素的目的是指定TLD的位置,設(shè)置在頁面上與標(biāo)簽區(qū)分開來的一個短別名。
    語法:<%@?taglib?prefix=”tag?prefix”?uri=”taglibURI”?%>
    屬性:prefix:用于標(biāo)識標(biāo)簽庫的唯一標(biāo)識。uri:標(biāo)簽庫本身的URI。
    uri不必指向一個實際文件,它是JSP容器可以在web.xml中查找實際文件位置的唯一標(biāo)識符。

    引自:http://www.javaresearch.org/article/showarticle.jsp?column=106&thread=51309


    posted on 2006-10-09 08:57 都市淘沙者 閱讀(296) 評論(0)  編輯  收藏 所屬分類: JSP/PHP

    主站蜘蛛池模板: 亚洲国产成a人v在线| 亚洲高清在线播放| 亚洲av无码日韩av无码网站冲| 久久福利资源网站免费看| 精品日韩亚洲AV无码| 久久国产色AV免费观看| 337p日本欧洲亚洲大胆艺术| 8x8×在线永久免费视频| 亚洲女人影院想要爱| 成人男女网18免费视频| 亚洲码和欧洲码一码二码三码| 日韩一区二区免费视频| 日韩久久无码免费毛片软件 | 国产免费AV片在线观看| 亚洲成在人天堂一区二区| 亚洲成年人免费网站| 亚洲www在线观看| 国产免费人成在线视频| caoporm超免费公开视频| 无码欧精品亚洲日韩一区| 久久精品国产免费观看三人同眠| 亚洲国产成人资源在线软件| 在线免费观看一区二区三区| 成年免费大片黄在线观看com| 久久久久久久尹人综合网亚洲 | 免费特级黄毛片在线成人观看 | 亚洲精选在线观看| 我要看WWW免费看插插视频| 猫咪免费观看人成网站在线| 国产l精品国产亚洲区在线观看| 蜜臀98精品国产免费观看| www.亚洲成在线| 亚洲午夜无码片在线观看影院猛| 一级毛片免费观看不卡视频| 亚洲色欲色欱wwW在线| 久久亚洲2019中文字幕| 亚洲第一网站免费视频| 午夜免费国产体验区免费的| 久久精品国产亚洲AV麻豆网站| 成人性生活免费视频| 免费精品99久久国产综合精品|