JSPServletJSF標簽庫的深入研究_JSP教程

      編輯Tag賺U幣
      教程Tag:暫無Tag,歡迎添加,賺取U幣!

      推薦:Spring框架下實現(xiàn)基于組的用戶權(quán)限管理
      在幾乎所有的web應用中都需要對訪問者(用戶)進行權(quán)限管理, 因為我們希望某些頁面只對特定的用戶開放, 以及某些操作只有符合身份的用戶才能進行。這之中涉及到了身份驗證和權(quán)限管理. 只有單用

      標簽庫Taglib

      標簽被定義和分布在一個稱為標簽庫的結(jié)構(gòu)中,一個標簽庫是由元信息和類組成的集合:

      1.標簽處理器:實現(xiàn)定制標簽功能的Java類。

      2.標簽附加信息(TEI):向JSP容器提供邊輯以確認標簽屬性和創(chuàng)建變量的類。

      3.標簽庫描述器(TLD):描述單個標簽和整個標簽庫屬性的XML文檔。

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

      一、標簽實現(xiàn)

      1.開發(fā)步驟

      a.定義標簽的名字、屬性、聲明的變量和標簽體的內(nèi)容。

      b.編寫標簽庫描述器TLD。

      c.編寫標簽處理器。

      d.在JSP頁面中使用標簽。

      2.JSP頁面在JSP容器中的轉(zhuǎn)換步驟:

      JSP頁面存在三種形式:jsp文件、java文件和class文件。

      a.指令元素、和向JSP容器提供轉(zhuǎn)換時信息。

      b.HTML行在_jspService()方法中依順序轉(zhuǎn)換到out.print()語名中。

      c.腳本元素的聲明被原封不動地復制到_jspService()方法外的源碼中。

      d.腳本元素的表達式在_jspService()方法中依順序轉(zhuǎn)換到out.print()語名中。

      e.腳本元素的scriptlet被原封不動地復制到_jspService()方法中。

      f.行為元素被轉(zhuǎn)換為執(zhí)行其功能的運行時邏輯代碼。

      g.定制標簽被擴展到調(diào)用其相應標簽處理器中方法的Java語句中。

      3.標簽在JSP容器中的轉(zhuǎn)換步驟:

      a.JSP容器使用taglib指令元素定位標簽庫描述器,將頁面中用到的定制標簽和TLD相匹配。

      b.讀取標簽庫描述器的標簽列表和每一標簽相關(guān)的類名字。

      c.在頁面中遇到一個標簽時,查找與具有指定名字的標簽前綴相關(guān)的一個標簽庫。

      d.容器使用在TLD中找到的標簽結(jié)構(gòu)信息生成一系列完成標簽功能的Java語句。

      二、標簽庫描述器(TLD)

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

      標簽庫描述器的DTD由一個簡單的元素組成,此元素包含下列一些子元素。

      整個標簽庫標記信息

      tlibversion標簽庫版本號。是一個點式十進制數(shù),最多為4組小數(shù)點分隔的數(shù)字組成。

      jspversion標簽庫所需的JSP規(guī)范最低版本。例如JSP1.1

      shortname標簽庫的縮寫名。JSP可以使用該名字作為庫中標簽的缺省前綴。

      uri標簽庫唯一URI的元素。典型URL位置來自可下載taglib的位置。

      info標簽庫描述信息。

      每個標簽處理器及其屬性

      tag在TLD中加入標簽,描述組成庫的每個標簽。

      name與標簽庫的名字前綴一起使用的標簽的名字,是JSP容器唯一的標簽標識。

      tagclass實現(xiàn)標簽的標簽處理器類的全名。

      teiclass標簽附加信息(TEI)類的全名。TEI類給出關(guān)于標簽處理器創(chuàng)建變量及對標簽司性執(zhí)行的任意有效性驗證的信息。

      bodycontent描述標簽處理器如何使用標簽體的內(nèi)容。有三種取值:

      empty:表示標簽體必須為空;

      JSP:表示腳本元素和模板及其它標簽一樣被評估。

      tagdependent:體內(nèi)容被原封不動寫入BodyContent,其它腳本元素以源碼形式出現(xiàn),而不被JSP容器解釋。

      info標簽的人工可讀描述性信息。

      attribute使用標簽時被編碼的屬性信息。用于定義標簽的屬性。

      屬性名:屬性的名字。

      true|false:屬性在標簽用到的位置是否要被編碼。

      true|false:屬性值能否用表達式指定。

      三、標簽處理器

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

      標簽處理器實現(xiàn)了標簽的行為,標簽處理器是Java類。

      1.標簽處理器的工作方式

      a.導入javax.servlet.jsp和javax.servlet.jsp.tagext包。

      b.實現(xiàn)javax.servlet.jsp.tagext包中的Tag接口或BodyTag接口。BodyTag是Tag的子接口。

      c.繼承TagSupport類或BodyTagSuppoert類。它們是上述接口的缺省實現(xiàn)。

      d.重載publicintdoStartTag()throwsJspException方法。

      2.標簽處理器的接口與實現(xiàn)

      javax.servlet.jsp.tagext.Tag是實現(xiàn)標簽的最基本的接口。

      javax.servlet.jsp.tagext.TagSupport是實現(xiàn)Tag接口的具體類。

      通常情況下繼承tagSupport類而不直接實現(xiàn)Tag接口通常是有益的。除了對所有必需方法提供了缺省實現(xiàn)外、還保存了pageContext對象及對嵌套標簽的支持。

      Tag接口包含4個常量,表示doStartTag()和doEndTag()方法可能的返回碼。

      EVAL_BODY_INCLUDE當doStartTag()返回時,指明servlet應對標簽體進行評估。

      SKIP_BODY當doStartTag()返回時,指明servlet應忽視標簽體。

      EVAL_PAGE當doEndTag()返回時,指明頁面其余部分應被評估。

      SKIP_PAGE當doEndTag()返回時,指明頁面其余部分就被跳過。

      Tag接口的方法

      publicvoidsetPageContext(PageContextctx)生成的servlet在請求處理器執(zhí)行其它任務前首先調(diào)用此方法,實現(xiàn)類應保存上下文對象以便它可以在標簽生命期中使用。從頁面上下文中標簽處理器可以訪問所有JSP隱含對象。

      publicvoidsetParent(Tagp)使用一個標答可以找到操作棧中它上面的標簽。在setPageContext后立即調(diào)用。

      publicTaggetParent()返回父標簽。

      publicintdoStartTag()throwsJsp在設置了頁面上下文、父標簽和開始標記中編碼的屬性后調(diào)用。返回碼表明JSP實現(xiàn)servlet是否就評估標簽體。

      publicintdoEndTag()throwsJspException當遇到結(jié)否標記時調(diào)用。返回碼表明JSP是否就繼紐頁面的其余部份。

      publicvoidrelease()確保在頁面退出前被調(diào)用。釋放資源并重置標簽處理器狀態(tài)。

      TagSupport類的方法

      publicstaticTagfinAncestorWithClass(TagthisTag,Classcls)為所需的父標簽處理器查找運行時標簽棧。一個標簽處理器可以提供其范圍內(nèi)子標簽調(diào)用的方法。

      publicvoidsetId(Stringid)保存和檢索在id屬性中指定的名字。

      publicvoidsetValue(Stringname,Objecto)在本地哈希表中設置指定名字的值。

      publicObjectgetValue(Stringname)從本地哈希表中獲取指定名稱的值。

      publicvoidremoveValue(Stringname)從本地哈希表中刪除指定名稱的值。

      publicEnumerationgetValues()返回哈希表中關(guān)鍵字的一個枚舉。

      3.標簽處理器的生命期

      a.生成servlet需要創(chuàng)建標簽處理器類的一個實例。實現(xiàn)方式通常是調(diào)用JSP容器的工廠類的一個方法,工廠類包含一個標簽處理器實例池以使其可重用不再處于激活狀態(tài)的對象。

      b.初始化標簽處理器,使servlet獲知其存在性。servlet通過調(diào)用標簽處理器的兩個方法實現(xiàn)此過程:setPageContext(PageContextctx)和setParent(Tagparent)。

      c.如果標簽具有屬性,屬性的取值通過處理器提供setter方法傳入到對象。屬性setter方法是一個標簽支持屬性所需的唯一方法。

      d.頁面的上下文和父標簽已被調(diào)置,并已具備屬性。此時調(diào)用標簽處理器的doStartTag()方法,該方法可以讀取這些變量并執(zhí)行實現(xiàn)標答功能所需的計算和操作。doStartTag()方法必須返回一個整型數(shù)。返回EVAL_BODY_INCLUDE則正常處理標簽體,返回SKIP_BODY則從初始JSP頁面中直到此標簽結(jié)束標記處的內(nèi)容均被忽略。

      e.標簽體被評估或忽視后調(diào)用標簽處理器的doEndTag()方法,返回EVAL_PAGE則頁面的其余部分被評估,返回SKIP_PAGE則servlet代碼立即從_jspService()中返回。

      4.體標簽處理器的接口與實現(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的輸出流,而是積累在一字符串緩存中。當標簽體完成后其對象仍可在doEndTag()方法中可以應用,由getString()或getReader()方法操作。并在必要時修改及寫入恢復的JspWriter輸出流。

      BodyContent類的方法

      publicvoidflush()throwsIOException復寫JspWrite.flush()方法以便它總是產(chǎn)生溢出。刷新寫入已失效,因為它沒有連接到將被寫入的實際輸出流中。

      publicvoidclearBody()重置BodyContent緩存為空。

      publicReadergetReader()返回Reader讀取體內(nèi)容。

      publicStringgetString()返回包含體內(nèi)容的一個字符串。

      publicvoidwriteOut(Writew)將體內(nèi)容寫入指定輸出。

      publicJspWritegetEnclosingWrite()返回棧中下一個更高的寫入者對象(可能是另一個BodyContent對象)。

      分享:選擇JSF不選Struts的十大理由
      我的一個客戶不知道該選用Struts還是JSF。就像你預料的那樣,我通常會問:這2中框架之間有什么區(qū)別?當然,除了我的這個客戶外很多人都面臨這樣的選擇。 總的來說,我建議

      來源:模板無憂//所屬分類:JSP教程/更新時間:2008-08-22
      相關(guān)JSP教程