posts - 495,  comments - 11,  trackbacks - 0

          標準的JSP 標記可以調用JavaBeans組件或者執行客戶的請求,這大大降低了JSP開發的復雜度和維護量。
          JSP技術也允許你自定義taglib,其實換句話說,taglib可以看成是對JSP標記的一種擴展,正如xml是對
          html的一種擴展一樣。taglib通常定義在tag標簽庫中,這種標簽庫存放著你自己定義的tag標簽。

          簡而言之,如果使用taglib,那么你可以設計自己的JSP標記!

          一般來說,自定義tag標簽主要用于操作隱藏對象、處理html提交表單、訪問數據庫或其它企業級的服務,
          諸如郵件和目錄操作等等。自定義tag標簽的使用者一般都是那些對java編程語言非常精通,而且對數據
          訪問和企業級服務訪問都非常熟悉的程序員,對于HTML設計者來說,使得他可以不去關注那些較復雜的商
          業邏輯,而將精力放在網頁設計上。同時,它也將庫開發者和庫使用者進行合理分工,自定義tag標簽將
          那些重復工作進行封裝,從而大大提高了生產力,而且可以使得tag庫可用于不同的項目中,完美地體現
          了軟件復用的思想。

          在這篇文章中,我們主要討論:

          · 什么是自定義tag標簽?

          · 怎么使用tag標簽?

          o 聲明要使用的tag庫

          o 找到與之對應的tag處理類

          o tag標簽的類型

          · 自定義tag標簽

          o tag處理類

          o tag庫描述

          o tag標簽示例

          o 帶屬性的tag

          o 帶body的tag

          o 定義了腳本變量的tag

          o 具有協作關系的tag

          · 自定義tag標簽

          o 一個迭代tag的例子

          o 一個模板tag庫

          o tag處理類到底是怎樣被調用的?


          什么是自定義的tag?

          一個自定義的tag標簽是用戶定義的一種JSP標記。當一個含有自定義的tag標簽的JSP頁面被jsp引擎編譯
          成servlet時,tag標簽被轉化成了對一個稱為tag處理類的對象進行的操作。于是當JSP頁面被jsp引擎轉
          化為servlet后,實際上tag標簽被轉化成為了對tag處理類的操作。

          自定義tag標簽有很多特色,諸如:

          · 可以在JSP頁面中自定義tag標簽的屬性

          · 訪問JSP頁面中的所有對象

          · 可以動態地修改頁面輸出

          · 彼此這間可以相互通信。你可以先創建一個JavaBeans組件,然后在一個tag中調用此JavaBeans組件,
          同時可以在另一個tag中調用它。

          · tag允許相互嵌套,可以在一個JSP頁面中完成一些復雜的交互。


          使用tag標簽


          本節主要描述怎樣在JSP頁面中使用tag標簽,以及tag標簽的不同類型。

          要使用tag標簽,JSP程序員必須做2件事:

          · 聲明此tag標簽的tag庫

          · 實現此tag標簽

          聲明tag標簽所在的tag庫

          如果要使用tag標簽,則應用JSP的taglib指示符來指定其tag庫(注意:taglib要在在使用此tag標簽之前聲明)

          <%@ taglib uri=”/WEB-INF/tutorial-template.tld” prefix=”tt” %>

          uri屬性定義了唯一的標簽庫描述(以下簡稱TLD),它可以是直接是tld文件名或一個獨一無二的名字。
          prefix是用來區別其它TLD中和本TLD中有重名的tag的一種手段。

          TLD必須以.tld作為擴展名,并且存放在當前應用的WEB-INF目錄或其子目錄下。你可以通過它的文件名
          直接引用它,也可以通過別的方式間接地引用它。

          以下taglib指示符直接引用一個TLD:

          <%@ taglib uri=”/WEB-INF/tutorial-template.tld” prefix=”tt” %>

          以下的taglib指示符通過一個邏輯名稱間接地引用一個TLD:

          <%@ taglib uri=”/tutorial-template” prefix=”tt” %>

          如果是間接引用TLD的話,那你必須還要在web.xml中定義此邏輯名稱與tld文件之間的映射,具體做法
          是在web.xml中加入一個名為taglib的元素:

          <taglib>

          <taglib-uri>/tutorial-template</taglib-uri>

          <taglib-location>

          /WEB-INF/tutorial-template.tld

          </taglib-location>

          </taglib>


          實現此tag標簽


          為了實現tag標簽,你有2種方法來存放tag處理類。一、讓tag處理類以.class的方式存放于當前應用
          的WEB-INF/class子目錄下,二、如果tag處理類是以JAR包的形式存在的話,那可以放在當前應用的
          WEB-INF/lib目錄下,如果tag處理類要在多個應用中共享,那么它就應放在jsp服務器上的common/lib
          目錄下,對于tomcat來說,就是tomcat/common/lib目錄下。


          tag標簽類型


          自定義的tag標簽遵循XML語法。它有一個開始標記和一個結束標記,有的還有body(即文本節點):

          <tt:tag>

          body

          </tt:tag>


          一個不帶body的tag標簽如下:

          <tt:tag />


          簡單的tag標簽

          一個沒有body和屬性的tag標簽如下:

          <tt:simple />


          帶屬性的tag標簽


          自定義標簽可以有自己的屬性。屬性一般在開始標記中定義,語法為 attr=”value”。屬性的作用相當
          于自定義標簽的一個參數,它影響著tag處理類的行為。你可以在TLD中詳細定義它。

          你可以用一個String常量給一個屬性賦值,也可以通過表達式給它賦值,如<%= ...%>。以struts為例,
          它的logic:present標簽就是用的String常量來給屬性賦值:

          <loglic:present parameter = “Clear”>

          而另一個標簽logic:iterate是用表達式來給屬性賦值:

          <logci:iterate collection=”<%= bookDB.getBooks() %>”

          id=”book” type=”database.BookDetails”>


          帶body的tag標簽

          一個自定義標簽可以包含其它自定義標簽、腳本變量、HTML標記或其它內容。

          在下述例子中,此JSP頁面使用了struts的logic:present標簽,如果些標簽定義了parameter=”Clear”的
          屬性,則將清除購物車的內容,然后打印出一條信息:

          <logic:present parameter=”Clear”>

          <% cart.clear(); %>

          <font color=”#ff0000” size=”+2”><strong>

          你選擇了清除購物車!

          </strong></font>

          </logic:present>


          到底是用屬性還是用body來傳遞信息?

          如上所述,我們既可以通過屬性,也可以通過body來傳遞信息。但一般來說,比較簡單的類型,如字符串
          或簡單表達式最好采用屬性來傳遞信息。


          定義腳本變量的tag標簽

          所謂腳本變量,是指JSP中可以調用的變量或對象。它可由tag標簽產生。以下示例闡述了一個tag標簽定義
          了一個名為tx的由JNDI所定義的事務處理對象。腳本變量可以是ejb對象、事務、數據庫連接等等:

          <tt:lookup id=”tx” type=”UserTransaction” name=”java:comp/UserTransaction” />

          <% tx.begin(); %>

          ...


          具有協作關系的tag標簽

          自定義tag標簽之間可以通過共享對象來實現協作。在下述例子中,標簽tag1創建了一個名為obj1的對象,
          在標簽tag2仍可以重復使用obj。

          <tt:tag1 attr1=”obj1” value1=”value” />

          <tt:tag2 attr1=”obj1” />

          在以下這個例子當中,如果外層的tag標簽創建了一個對象,那么其內層的所有tag標簽都可以使用這個對象。
          由于這樣產生的對象沒有一個指定的名字,那么就可以將少重名的沖突。這個例子闡述了一系列協作的嵌套對象。

          <tt:outerTag>

          <tt:innerTag />

          </tt:outerTag>

          Tag處理類


          Tag處理類必須實現Tag接口或BodyTag接口,不過現在一般都流行從TagSupport或BodyTagSupport類中繼承,
          這些類或接口都可以在javax.servlet.jsp.tagext包中找到。

          當JSP引擎看到自己的JSP頁面中包含有tag標簽時,它會調用doStartTag方法來處理tag標簽的開頭,
          調用doEndTag方法來處理tag標簽的結束。

          下表說明不同類型的tag所需要不同的處理過程:

          Tag處理類的方法

          Tag標簽類型
          所調用的方法

          基本標簽
          doStartTag, doEndTag, release

          帶屬性的標簽
          doStartTag, doEndTag, set/getAttribute1...N, release

          帶內容的標簽
          doStartTag, doEndTag, release

          帶內容的標簽,且

          內容重復循環
          doStartTag, doAfterBody, doEndTag, release

          帶內容的標簽,且內容與JSP交互
          doStartTag, doEndTag, release, doInitBody, doAfterBody, release

          一個tag處理類可以通過javax.servlet.jsp.PageContext來與JSP交互,通過javax.servlet.jsp.PageContext類,
          tag處理類可以訪問JSP中的request、session和application對像。

          如果tag標簽是互相嵌套的,那內層的tag處理類可以通過它的parent屬性來訪問上層的tag處理類。

          一般情況都將所有的tag處理類打成了JAR的包,以便于發布。


          Tag庫描述(簡稱TLD)


          Tag庫是用xml語言描述的,TLD包括了tag庫中所有tag標簽的描述,它一般用來被jsp服務器用來校驗tag的語法
          正確性,或者被jsp開發者用來開發新的標簽。

          TLD的文件擴展名必須為.tld,而且必須放在當前WEB應用的WEB-INF目錄或其子目錄中。

          一個TLD的內容的開頭必須遵守標準的XML開頭,用于描述DTD和xml的版本,例如:

          <?xml version="1.0" encoding="ISO-8859-1" ?>

          <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" " TLD必須以<taglib>來作為它的根元素,<taglib>的子元素如下表:


          <taglib>的子元素

          Element
          Description

          tlib-version
          Tag庫的版本

          jsp-version
          Tag庫所需要的jsp的版本

          short-name
          助記符,tag的一個別名(可選)

          uri
          用于確定一個唯一的tag庫

          display-name
          被可視化工具(諸如Jbuilder)用來顯示的名稱(可選)

          small-icon
          被可視化工具(諸如Jbuilder)用來顯示的小圖標(可選)

          large-icon
          被可視化工具(諸如Jbuilder)用來顯示的大圖標(可選)

          description
          對tag庫的描述(可選)

          listener
          參見下面listener元素

          tag
          參見下面tag 元素

          Listener元素

          一個tag庫可能定義一些類做為它的事件偵聽類,這些類在TLD中被稱為listener 元素,
          jsp服務器將會實例化這些偵聽類,并且注冊它們。Listener元素中有一個叫listener-class的子元素,
          這個元素的值必須是該偵聽類的完整類名。

          Tag元素

          每個tag元素在tag庫中都要指出它的名字、類名、腳本變量、tag的屬性。其中腳本變量的值可以
          直接在TLD中定義或通過tag附加信息的類來取得。每個屬性描述了這個屬性是否可以省略,它的值
          是否可以通過<%= …%>這樣的JSP語法來獲得,以及屬性的類型。

          每一個tag在TLD中對應一個tag元素,下表是tag元素的子元素:

          Tag元素的子元素

          元素名稱
          描述

          name
          獨一無二的元素名

          tag-class
          Tag標簽對應的tag處理類

          tei-class
          javax.servlet.jsp.tagext.TagExtraInfo的子類,用于表達腳本變量(可選)

          body-content
          Tag標簽body的類型

          display-name
          被可視化工具(諸如Jbuilder)用來顯示的名稱(可選)

          small-icon
          被可視化工具(諸如Jbuilder)用來顯示的小圖標(可選)

          large-icon
          被可視化工具(諸如Jbuilder)用來顯示的大圖標(可選)

          description
          此tag標簽的描述

          variable
          提供腳本變量的信息(同tei-class)(可選)

          attribute
          Tag標簽的屬性名

          以下章節介紹對于不同類型的tag,如何具體地實現它們。


          簡單的tag


          tag處理類

          簡單的tag處理類必須實現Tag接口的doStartTag和doEndTag方法。當jsp引擎碰到tag標簽的開頭時,
          doStartTag被調用,因為簡單的tag沒有body,所以此方法將返回 SKIP_BODY。當jsp引擎碰到tag標簽的
          結尾時,doEndTag被調用,如果余下的頁面還要被計算,那它將返回EVAL_PAGE,否則將會返回SKIP_PAGE。

          以下是例子:對于標簽 <tt:simple /> ,它的tag處理類實現如下:


          public SimpleTag extends TagSupport

          {

          public int doStartTag() throws JspException

          {

          try{

          pageContext.getOut().print(“Hello.”);

          }catch(Exception e){

          throw new JspTagException(“SimpleTag: “ + e.getMessage());

          }

          return SKIP_BODY;

          }

          public int doEndTag()

          {

          return EVAL_PAGE;

          }

          }


          注意:如果tag標簽沒有內容的話,那必須定義body-content元素為空,例如

          <body-content>empty</body-content>


          帶屬性的tag標簽


          tag處理類

          對于tag標簽的每個屬性,你必須依照JavaBeans規范來定義其屬性,以及get和set方法。以struts的
          logic:present 標簽為例,

          <logic:present parameter=”Clear”>

          與此相應,此tag處理類應有如下方法和定義:


          protected String parameter = null;

          public String getParameter()

          {

          return this.parameter;

          }

          public void setParameter(String parameter)

          {

          this.parameter = parameter;

          }


          注意:如果你的屬性名為id,而且你的tag處理類是從TagSupport類繼承的,那你就不需要定義它的屬性
          和set和get方法,因為他們早已在TagSupport被定義過了。


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


          網站導航:
           
          主站蜘蛛池模板: 建阳市| 彰化县| 英吉沙县| 古交市| 右玉县| 云龙县| 顺义区| 肥城市| 德庆县| 汉阴县| 成安县| 南皮县| 如东县| 闽清县| 吉首市| 菏泽市| 舞阳县| 保靖县| 兰考县| 汪清县| 芜湖市| 晋中市| 边坝县| 商水县| 延寿县| 台北县| 五华县| 阳泉市| 凤冈县| 恩平市| 北京市| 宁阳县| 榆林市| 淮北市| 江安县| 云南省| 额敏县| 珠海市| 南岸区| 田林县| 岗巴县|