亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JSP > 正文

JSP中標簽庫的深入研究

2024-09-05 00:19:54
字體:
來源:轉載
供稿:網友
  • 網站運營seo文章大全
  • 提供全面的站長運營經驗及seo技術!
  • 標簽庫taglib

    標簽被定義和分布在一個稱為標簽庫的結構中,一個標簽庫是由元信息和類組成的集合:
    1.標簽處理器:實現定制標簽功能的java類。
    2.標簽附加信息(tei):向jsp容器提供邊輯以確認標簽屬性和創建變量的類。
    3.標簽庫描述器(tld):描述單個標簽和整個標簽庫屬性的xml文檔。

    標簽處理器和標簽附加信息需要定位在jsp容器類載入器可以找到的地方。標簽庫描述器可在url指定的符意位置。jsp1.1規范要求jsp容器接受一個打包成因定結構的jar文件的標簽庫。tld必須是/meta-inf目錄中名為taglib.tld的文件,jar文件則復制到/web-inf/lib目錄下。

    一、標簽實現

    1.開發步驟
    a.定義標簽的名字、屬性、聲明的變量和標簽體的內容。
    b.編寫標簽庫描述器tld。
    c.編寫標簽處理器。
    d.在jsp頁面中使用標簽。

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

    3.標簽在jsp容器中的轉換步驟:
    a.jsp容器使用taglib指令元素定位標簽庫描述器,將頁面中用到的定制標簽和tld相匹配。
    b.讀取標簽庫描述器的標簽列表和每一標簽相關的類名字。
    c.在頁面中遇到一個標簽時,查找與具有指定名字的標簽前綴相關的一個標簽庫。
    d.容器使用在tld中找到的標簽結構信息生成一系列完成標簽功能的java語句。


    二、標簽庫描述器(tld)

    標簽庫描述器是一個描述整個標簽庫標記信息和庫中每個標簽處理器及其屬性的xml文檔。

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

    三、標簽處理器

    標簽處理器是通過實現jsp容器調用的一系列預定義方法執行定制標簽行為的一個java類。
    標簽處理器實現了標簽的行為,標簽處理器是java類。

    1.標簽處理器的工作方式
    a.導入javax.servlet.jsp和javax.servlet.jsp.tagext包。
    b.實現javax.servlet.jsp.tagext包中的tag接口或bodytag接口。bodytag是tag的子接口。
    c.繼承tagsupport類或bodytagsuppoert類。它們是上述接口的缺省實現。
    d.重載public int dostarttag()throws jspexception方法。

    2.標簽處理器的接口與實現
    javax.servlet.jsp.tagext.tag是實現標簽的最基本的接口。
    javax.servlet.jsp.tagext.tagsupport是實現tag接口的具體類。
    通常情況下繼承tagsupport類而不直接實現tag接口通常是有益的。除了對所有必需方法提供了缺省實現外、還保存了pagecontext對象及對嵌套標簽的支持。
    tag接口包含4個常量,表示dostarttag()和doendtag()方法可能的返回碼。
    eval_body_include    當dostarttag()返回時,指明servlet應對標簽體進行評估。
    skip_body    當dostarttag()返回時,指明servlet應忽視標簽體。
    eval_page    當doendtag()返回時,指明頁面其余部分應被評估。
    skip_page    當doendtag()返回時,指明頁面其余部分就被跳過。
    tag接口的方法
    public void setpagecontext (pagecontext ctx)    生成的servlet在請求處理器執行其它任務前首先調用此方法,實現類應保存上下文對象以便它可以在標簽生命期中使用。從頁面上下文中標簽處理器可以訪問所有jsp隱含對象。
    public void setparent(tag p)    使用一個標答可以找到操作棧中它上面的標簽。在setpagecontext后立即調用。
    public tag getparent()    返回父標簽。
    public int dostarttag() throws jsp    在設置了頁面上下文、父標簽和開始標記中編碼的屬性后調用。返回碼表明jsp實現servlet是否就評估標簽體。
    public int doendtag()throws jspexception    當遇到結否標記時調用。返回碼表明jsp是否就繼紐頁面的其余部份。
    public void release()    確保在頁面退出前被調用。釋放資源并重置標簽處理器狀態。
    tagsupport類的方法
    public static tag financestorwithclass(tag thistag, class cls)    為所需的父標簽處理器查找運行時標簽棧。一個標簽處理器可以提供其范圍內子標簽調用的方法。
    public void setid(string id)    保存和檢索在id屬性中指定的名字。
    public void setvalue(string name, object o)    在本地哈希表中設置指定名字的值。
    public object getvalue (string name)    從本地哈希表中獲取指定名稱的值。
    public void removevalue (string name)    從本地哈希表中刪除指定名稱的值。
    public enumeration getvalues()    返回哈希表中關鍵字的一個枚舉。

    3.標簽處理器的生命期
    a.生成servlet需要創建標簽處理器類的一個實例。實現方式通常是調用jsp容器的工廠類的一個方法,工廠類包含一個標簽處理器實例池以使其可重用不再處于激活狀態的對象。
    b.初始化標簽處理器,使servlet獲知其存在性。servlet通過調用標簽處理器的兩個方法實現此過程:setpagecontext(pagecontext ctx)和setparent(tag parent)。
    c.如果標簽具有屬性,屬性的取值通過處理器提供setter方法傳入到對象。屬性setter方法是一個標簽支持屬性所需的唯一方法。
    d.頁面的上下文和父標簽已被調置,并已具備屬性。此時調用標簽處理器的dostarttag()方法,該方法可以讀取這些變量并執行實現標答功能所需的計算和操作。dostarttag()方法必須返回一個整型數。返回eval_body_include則正常處理標簽體,返回skip_body則從初始jsp頁面中直到此標簽結束標記處的內容均被忽略。
    e.標簽體被評估或忽視后調用標簽處理器的doendtag()方法,返回eval_page則頁面的其余部分被評估,返回skip_page則servlet代碼立即從_jspservice()中返回。

    4.體標簽處理器的接口與實現
    javax.servlet.jsp.tagext.bodytag是tag的子接口。
    javax.servlet.jsp.tagext.bodytagsupport是實現bodytag類。
    bodycontent是javax.servlet.jsp.jspwriter的子類,但與其父類有所區別。
    bodycontent對象的內容不自動寫了入servlet的輸出流,而是積累在一字符串緩存中。當標簽體完成后其對象仍可在doendtag()方法中可以應用,由getstring()或getreader()方法操作。并在必要時修改及寫入恢復的jspwriter輸出流。
    bodycontent類的方法
    public void flush()throws ioexception    復寫jspwrite.flush()方法以便它總是產生溢出。刷新寫入已失效,因為它沒有連接到將被寫入的實際輸出流中。
    public void clearbody()    重置bodycontent緩存為空。
    public reader getreader()    返回reader讀取體內容。
    public string getstring()    返回包含體內容的一個字符串。
    public void writeout(write w)    將體內容寫入指定輸出。
    public jspwrite getenclosing write()    返回棧中下一個更高的寫入者對象(可能是另一個bodycontent對象)。
    bodytag接口定義了一個新的整型常量
    eval_body_tag    當dostarttag()返回時,使得新的bodycontent對象被創建并與此標簽處理器相關聯。當doafterbody()返回時,使得jsp servlet在修改完此標簽控制的任意變量后再次評估體。
    bodytag接口的方法
    public void setbodycontern (bodycontent out)    在當前jspwriter已被寫入,一個新的bodycontent在被創建后由jsp servlet調用,它發生在dostarttag()之后。
    public void doinitbody() throws jspexception    setbodycontent()之后,體被評估前調用的生命期方法。如果多次評估體,此方法只調用一次。
    public init doafterbody() throws jspexception    體被評估后,bodycontent寫入者仍處于激活狀態時調用的生命期方法。此方法必須返回eval_body_tag或skip_body,若返回eval_body_tag時體再次被評估。
    bodytagsupport類的方法
    public int dostarttag() throws jspexception    復寫tagsupport中的dostarttag()方法。
    public int doendtag() throws jspexception    調用tagsupport中的doendtag()方法,返回結果。
    public void setbodycontent (bodycontent out)    在一保護成員變量bodycontent中保存新的體內容對象,子類可直接訪問此對象。
    public void doinitbody() throws jspexception    缺省什么都不做。被需要執行初始化的子類所復寫。
    public int doafterbody() throws jspexception    每次體被評估后由jsp servlet調用,體同容對象仍處于激活狀態。返回skep_body或eval_body_tag則體再次被評估
    public void release()    設置bodycontent對象為null,然后調用super.release()。
    public bodycontent getbodycontent()    返回bodycontent變量。子類已經可以訪問保護變量,但此方法允許無關的標簽處理類對此體內容發送輸出。
    public jspwriter getpreviousout()    在bodycontent變量上調用getenclosingwriter()并返回結果的簡便方法。

    5.體標簽處理器的生命期

    a.生成servlet需要創建標簽處理器類的一個實例。實現方式通常是調用jsp容器的工廠類的一個方法,工廠類包含一個標簽處理器實例池以使其可重用不再處于激活狀態的對象。
    b.初始化標簽處理器,使servlet獲知其存在性。servlet通過調用標簽處理器的兩個方法實現此過程:setpagecontext(pagecontext ctx)和setparent(tag parent)。
    c.如果標簽具有屬性,屬性的取值通過處理器提供setter方法傳入到對象。屬性setter方法是一個標簽支持屬性所需的唯一方法。
    d.頁面的上下文和父標簽已被調置,并已具備屬性。調用標簽處理器的dostarttag()方法,該方法可以讀取這些變量并執行實現標答功能所需的計算和操作。
    dostarttag()方法必須返回一個整型數。
    返回eval_body_tag則正常處理標簽體(跳到e);
    返回skip_body則從初始jsp頁面中直到此標簽結束標記處的內容均被忽略。(跳到f)
    e.如果返回eval_body_tag時,則正常處理標簽體。
        e1.在棧中保存當前的jspwriter對象,創建新的bodycontent對象,并將其置為jsp頁面的out對象保存在上下文范圍內名為name的屬性中。并調用它的setbodycontent()方法。
        e2.調用doinitbody()方法進行初始化。
        e3.處理標簽體。將輸出寫入bodycontent對象中,此過程依賴于tld的標簽元素,有三種可能取值。
        e4.調用doafterbody()方法,將體內體內容寫入jspwriter,可如下實現:
    jspwriter out=bodycontent.getenclosingwriter();
    out.println(bodycontent.getstring());//bodycontent.writeout(out);
    bodycontent.clear();
        e5.doafterbody()方法返回兩種可能:
    返回eval_body_tag時,再對標簽體進行評估,這是數組和枚舉被循環處理的典型情況。
        返回skip_page時,繼續頁面的其余部份。
    e6.體內容完成,因此創建它的過程被反向:
        調用pagecontent.popbody()方法檢索前面的jspwriter對象。
        將寫入者設置回out隱含對象。
    f.標簽體被評估或忽視后調用doendtag()方法,允許標簽處理器像輸出流發回內容。
    返回eval_page則頁面的其余部分被評估;
    返回skip_page則servlet代碼立即從_jspservice()中返回。
    g. 此時體的內容在受保護的bodycontent對象中仍然可用。
    可以將它寫入servlet輸出流中:
    jspwriter out=pagecontext.getout();
    out.println(bodycontent.getstring());
    或者
    bodycontent.writeout(pagecontext.getout());

    6.標簽附加信息類


    四、標簽指令

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

    發表評論 共有條評論
    用戶名: 密碼:
    驗證碼: 匿名發表
    亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
    欧美激情亚洲一区| 欧美性猛交xxxx乱大交3| 国产不卡在线观看| 日韩少妇与小伙激情| 亚洲区bt下载| 久久久噜噜噜久噜久久| 97国产真实伦对白精彩视频8| 国产精品一区二区三区久久| 国产精品91免费在线| 欧美一级片久久久久久久| 成人欧美在线观看| 日韩国产在线播放| 中文字幕亚洲专区| 国产欧亚日韩视频| 成人黄色免费片| 精品在线观看国产| 欧美自拍视频在线观看| 国产成人精品日本亚洲专区61| 中文字幕一区二区三区电影| 亚洲午夜久久久久久久| 欧美成人精品在线观看| 91免费国产网站| 日韩精品免费观看| 亚洲专区在线视频| 国产免费观看久久黄| 色综合久久88色综合天天看泰| 国产精品日韩精品| 亚洲欧美综合v| 日韩成人av网| 91亚洲精品在线观看| 日韩禁在线播放| 亚洲欧美日韩中文在线| 国产精品电影网| 日韩免费在线视频| 久久国产精品免费视频| 97色在线观看| 日韩av黄色在线观看| 国产99在线|中文| 国产精品扒开腿做爽爽爽的视频| 欧美夫妻性生活视频| 大桥未久av一区二区三区| 久久免费视频网站| 亚洲自拍偷拍网址| 国产福利视频一区二区| 日韩专区在线观看| 中文字幕亚洲欧美一区二区三区| 久久av资源网站| 97国产精品视频| 最近2019中文免费高清视频观看www99| 粉嫩老牛aⅴ一区二区三区| 中文字幕v亚洲ⅴv天堂| 国产精品久久久久久久久久尿| 在线电影av不卡网址| 欧美日韩中文字幕日韩欧美| 日韩电影视频免费| 88xx成人精品| 国产精品白丝av嫩草影院| 欧美成年人在线观看| 欧美另类极品videosbest最新版本| 日日摸夜夜添一区| 92看片淫黄大片看国产片| 久久天天躁狠狠躁老女人| 久久久久久久91| 91久久久久久久一区二区| 亚洲美女喷白浆| 精品久久香蕉国产线看观看亚洲| 欧美精品在线免费播放| 美日韩精品视频免费看| 国产成人97精品免费看片| 欧美一级视频免费在线观看| 岛国精品视频在线播放| 国产精品久久网| 91po在线观看91精品国产性色| 亚洲精品电影网在线观看| 欧美国产高跟鞋裸体秀xxxhd| 久久综合伊人77777尤物| 夜夜嗨av色一区二区不卡| 北条麻妃一区二区在线观看| 国产成人鲁鲁免费视频a| 色婷婷综合久久久久| 伊人一区二区三区久久精品| 一本一本久久a久久精品综合小说| 国产一区在线播放| 日韩激情在线视频| 亚洲欧美一区二区精品久久久| 精品免费在线观看| 人体精品一二三区| 国产精品国产自产拍高清av水多| 92福利视频午夜1000合集在线观看| 久久久久久久久电影| 97在线精品国自产拍中文| 成人a免费视频| 国产91久久婷婷一区二区| 不用播放器成人网| 国内精品伊人久久| 午夜美女久久久久爽久久| 国产精品亚洲аv天堂网| 国产亚洲精品综合一区91| 国产亚洲精品久久久优势| 九九精品在线播放| 国产精品亚洲欧美导航| 免费不卡在线观看av| 在线播放国产一区中文字幕剧情欧美| 国产视频亚洲视频| 国产91精品高潮白浆喷水| 97在线日本国产| 51精品在线观看| 国产ts人妖一区二区三区| 久久久伊人日本| 亚洲精品自在久久| 91久久久久久久久| 亚洲国产精品嫩草影院久久| 中文字幕亚洲欧美日韩高清| 成人午夜激情免费视频| 欧美放荡办公室videos4k| 欧美电影免费观看网站| 成人亚洲欧美一区二区三区| 国产在线播放不卡| 狠狠久久五月精品中文字幕| 另类图片亚洲另类| 成人激情在线播放| 国产精品久久97| 欧美最近摘花xxxx摘花| 97色在线播放视频| 国产z一区二区三区| 国产精品第3页| www.日韩不卡电影av| 在线观看久久久久久| 97激碰免费视频| 欧美乱大交做爰xxxⅹ性3| 亚洲男人天堂网站| 亚洲欧美制服另类日韩| 亚洲一区二区三区视频播放| 黄网站色欧美视频| 色妞欧美日韩在线| 欧美一区二区三区免费视| 福利视频导航一区| 欧美激情一二三| 欧美精品性视频| 成人黄色免费在线观看| 亚洲欧美日韩中文视频| 中文字幕日韩精品在线观看| 亚洲国产欧美一区二区丝袜黑人| 亚洲一区二区三区成人在线视频精品| 亚洲成人aaa| 亚洲免费视频在线观看| 日韩精品免费综合视频在线播放| 国产成人精品免高潮在线观看| 亚洲精品网站在线播放gif| 日韩国产高清视频在线| 亚洲精品国产成人| 国产成人精品999| 亚洲精品福利在线| 欧美www在线| 亚洲护士老师的毛茸茸最新章节| 92福利视频午夜1000合集在线观看| 色噜噜狠狠狠综合曰曰曰| 国产成人鲁鲁免费视频a| 欧美激情乱人伦一区| 欧美视频在线免费| 国产精品18久久久久久首页狼| 亚洲欧美国产高清va在线播| 色一情一乱一区二区| 日韩在线视频免费观看|