自定義標(biāo)簽詳細(xì)_第1頁
自定義標(biāo)簽詳細(xì)_第2頁
自定義標(biāo)簽詳細(xì)_第3頁
自定義標(biāo)簽詳細(xì)_第4頁
自定義標(biāo)簽詳細(xì)_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、JSP標(biāo)簽庫在這篇文章中,我們主要討論:· 什么是自定義tag標(biāo)簽?· 怎么使用tag標(biāo)簽?o 聲明要使用的tag庫o 找到與之對應(yīng)的tag處理類o tag標(biāo)簽的類型· 自定義tag標(biāo)簽o tag處理類o tag庫描述o tag標(biāo)簽示例o 帶屬性的tago 帶body的tago 定義了腳本變量的tago 具有協(xié)作關(guān)系的tag· 自定義tag標(biāo)簽o 一個迭代tag的例子o 一個模板tag庫o tag處理類到底是怎樣被調(diào)用的?什么是自定義的tag?一個自定義的tag標(biāo)簽是用戶定義的一種JSP標(biāo)記。當(dāng)一個含有自定義的tag標(biāo)簽的JSP頁面被jsp引擎編譯成se

2、rvlet時,tag標(biāo)簽被轉(zhuǎn)化成了對一個稱為tag處理類的對象進(jìn)行的操作。于是當(dāng)JSP頁面被jsp引擎轉(zhuǎn)化為servlet后,實際上tag標(biāo)簽被轉(zhuǎn)化成為了對tag處理類的操作。自定義tag標(biāo)簽有很多特色,諸如:· 可以在JSP頁面中自定義tag標(biāo)簽的屬性· 訪問JSP頁面中的所有對象· 可以動態(tài)地修改頁面輸出· 彼此這間可以相互通信。你可以先創(chuàng)建一個JavaBeans組件,然后在一個tag中調(diào)用此JavaBeans組件,同時可以在另一個tag中調(diào)用它。· tag允許相互嵌套,可以在一個JSP頁面中完成一些復(fù)雜的交互。使用tag標(biāo)簽本節(jié)主要描述怎

3、樣在JSP頁面中使用tag標(biāo)簽,以及tag標(biāo)簽的不同類型。要使用tag標(biāo)簽,JSP程序員必須做2件事:· 聲明此tag標(biāo)簽的tag庫· 實現(xiàn)此tag標(biāo)簽聲明tag標(biāo)簽所在的tag庫如果要使用tag標(biāo)簽,則應(yīng)用JSP的taglib指示符來指定其tag庫(注意:taglib要在在使用此tag標(biāo)簽之前聲明)<% taglib uri=”/WEB-INF/tutorial-template.tld” prefix=”tt” %>uri屬性定義了唯一的標(biāo)簽庫描述(以下簡稱TLD),它可以是直接是tld文件名或一個獨一無二的名字。prefix是用來區(qū)別其它TLD中和本TLD

4、中有重名的tag的一種手段。TLD必須以.tld作為擴(kuò)展名,并且存放在當(dāng)前應(yīng)用的WEB-INF目錄或其子目錄下。你可以通過它的文件名直接引用它,也可以通過別的方式間接地引用它。以下taglib指示符直接引用一個TLD:<% taglib uri=”/WEB-INF/tutorial-template.tld” prefix=”tt” %>以下的taglib指示符通過一個邏輯名稱間接地引用一個TLD:<% taglib uri=”/tutorial-template” prefix=”tt” %>如果是間接引用TLD的話,那你必須還要在web.xml中定義此邏輯名稱與tl

5、d文件之間的映射,具體做法是在web.xml中加入一個名為taglib的元素:<taglib><taglib-uri>/tutorial-template</taglib-uri><taglib-location>/WEB-INF/tutorial-template.tld</taglib-location></taglib>實現(xiàn)此tag標(biāo)簽為了實現(xiàn)tag標(biāo)簽,你有2種方法來存放tag處理類。一、讓tag處理類以.class的方式存放于當(dāng)前應(yīng)用的WEB-INF/class子目錄下,二、如果tag處理類是以JAR包的形式存在

6、的話,那可以放在當(dāng)前應(yīng)用的WEB-INF/lib目錄下,如果tag處理類要在多個應(yīng)用中共享,那么它就應(yīng)放在jsp服務(wù)器上的common/lib目錄下,對于tomcat來說,就是tomcat/common/lib目錄下。tag標(biāo)簽類型自定義的tag標(biāo)簽遵循XML語法。它有一個開始標(biāo)記和一個結(jié)束標(biāo)記,有的還有body(即文本節(jié)點):<tt:tag>body</tt:tag>一個不帶body的tag標(biāo)簽如下:<tt:tag />簡單的tag標(biāo)簽一個沒有body和屬性的tag標(biāo)簽如下:<tt:simple />帶屬性的tag標(biāo)簽自定義標(biāo)簽可以有自己的屬性

7、。屬性一般在開始標(biāo)記中定義,語法為 attr=”value”。屬性的作用相當(dāng)于自定義標(biāo)簽的一個參數(shù),它影響著tag處理類的行為。你可以在TLD中詳細(xì)定義它。你可以用一個String常量給一個屬性賦值,也可以通過表達(dá)式給它賦值,如<%= .%>。以struts為例,它的logic:present標(biāo)簽就是用的String常量來給屬性賦值:<loglic:present parameter = “Clear”>而另一個標(biāo)簽logic:iterate是用表達(dá)式來給屬性賦值:<logci:iterate collection=”<%= bookDB.getBooks(

8、) %>”id=”book” type=”database.BookDetails”>帶body的tag標(biāo)簽一個自定義標(biāo)簽可以包含其它自定義標(biāo)簽、腳本變量、HTML標(biāo)記或其它內(nèi)容。在下述例子中,此JSP頁面使用了struts的logic:present標(biāo)簽,如果些標(biāo)簽定義了parameter=”Clear”的屬性,則將清除購物車的內(nèi)容,然后打印出一條信息:<logic:present parameter=”Clear”><% cart.clear(); %><font color=”#ff0000” size=”+2”><strong>

9、; 你選擇了清除購物車!</strong></font></logic:present>到底是用屬性還是用body來傳遞信息?如上所述,我們既可以通過屬性,也可以通過body來傳遞信息。但一般來說,比較簡單的類型,如字符串或簡單表達(dá)式最好采用屬性來傳遞信息。定義腳本變量的tag標(biāo)簽所謂腳本變量,是指JSP中可以調(diào)用的變量或?qū)ο?。它可由tag標(biāo)簽產(chǎn)生。以下示例闡述了一個tag標(biāo)簽定義了一個名為tx的由JNDI所定義的事務(wù)處理對象。腳本變量可以是ejb對象、事務(wù)、數(shù)據(jù)庫連接等等:<tt:lookup id=”tx” type=”UserTransactio

10、n” name=”java:comp/UserTransaction” /><% tx.begin(); %>.具有協(xié)作關(guān)系的tag標(biāo)簽自定義tag標(biāo)簽之間可以通過共享對象來實現(xiàn)協(xié)作。在下述例子中,標(biāo)簽tag1創(chuàng)建了一個名為obj1的對象,在標(biāo)簽tag2仍可以重復(fù)使用obj。<tt:tag1 attr1=”obj1” value1=”value” /><tt:tag2 attr1=”obj1” />在以下這個例子當(dāng)中,如果外層的tag標(biāo)簽創(chuàng)建了一個對象,那么其內(nèi)層的所有tag標(biāo)簽都可以使用這個對象。由于這樣產(chǎn)生的對象沒有一個指定的名字,那么就可以將少重

11、名的沖突。這個例子闡述了一系列協(xié)作的嵌套對象。<tt:outerTag><tt:innerTag /></tt:outerTag>Tag處理類Tag處理類必須實現(xiàn)Tag接口或BodyTag接口,不過現(xiàn)在一般都流行從TagSupport或BodyTagSupport類中繼承,這些類或接口都可以在javax.servlet.jsp.tagext包中找到。當(dāng)JSP引擎看到自己的JSP頁面中包含有tag標(biāo)簽時,它會調(diào)用doStartTag方法來處理tag標(biāo)簽的開頭,調(diào)用doEndTag方法來處理tag標(biāo)簽的結(jié)束。下表說明不同類型的tag所需要不同的處理過程:Tag處

12、理類的方法Tag標(biāo)簽類型所調(diào)用的方法基本標(biāo)簽doStartTag, doEndTag, release帶屬性的標(biāo)簽doStartTag, doEndTag, set/getAttribute1.N, release帶內(nèi)容的標(biāo)簽doStartTag, doEndTag, release帶內(nèi)容的標(biāo)簽,且內(nèi)容重復(fù)循環(huán)doStartTag, doAfterBody, doEndTag, release帶內(nèi)容的標(biāo)簽,且內(nèi)容與JSP交互doStartTag, doEndTag, release, doInitBody, doAfterBody, release一個tag處理類可以通過javax.servl

13、et.jsp.PageContext來與JSP交互,通過javax.servlet.jsp.PageContext類,tag處理類可以訪問JSP中的request、session和application對像。如果tag標(biāo)簽是互相嵌套的,那內(nèi)層的tag處理類可以通過它的parent屬性來訪問上層的tag處理類。一般情況都將所有的tag處理類打成了JAR的包,以便于發(fā)布。Tag庫描述(簡稱TLD)Tag庫是用xml語言描述的,TLD包括了tag庫中所有tag標(biāo)簽的描述,它一般用來被jsp服務(wù)器用來校驗tag的語法正確性,或者被jsp開發(fā)者用來開發(fā)新的標(biāo)簽。TLD的文件擴(kuò)展名必須為.tld,而且必須

14、放在當(dāng)前WEB應(yīng)用的WEB-INF目錄或其子目錄中。一個TLD的內(nèi)容的開頭必須遵守標(biāo)準(zhǔn)的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>

15、的子元素ElementDescriptiontlib-versionTag庫的版本jsp-versionTag庫所需要的jsp的版本short-name助記符,tag的一個別名(可選)uri用于確定一個唯一的tag庫display-name被可視化工具(諸如Jbuilder)用來顯示的名稱(可選)small-icon被可視化工具(諸如Jbuilder)用來顯示的小圖標(biāo)(可選)large-icon被可視化工具(諸如Jbuilder)用來顯示的大圖標(biāo)(可選)description對tag庫的描述(可選)listener參見下面listener元素tag參見下面tag 元素Listener元素一個t

16、ag庫可能定義一些類做為它的事件偵聽類,這些類在TLD中被稱為listener 元素,jsp服務(wù)器將會實例化這些偵聽類,并且注冊它們。Listener元素中有一個叫l(wèi)istener-class的子元素,這個元素的值必須是該偵聽類的完整類名。Tag元素每個tag元素在tag庫中都要指出它的名字、類名、腳本變量、tag的屬性。其中腳本變量的值可以直接在TLD中定義或通過tag附加信息的類來取得。每個屬性描述了這個屬性是否可以省略,它的值是否可以通過<%= %>這樣的JSP語法來獲得,以及屬性的類型。每一個tag在TLD中對應(yīng)一個tag元素,下表是tag元素的子元素:Tag元素的子元素元

17、素名稱描述name獨一無二的元素名tag-classTag標(biāo)簽對應(yīng)的tag處理類tei-classjavax.servlet.jsp.tagext.TagExtraInfo的子類,用于表達(dá)腳本變量(可選)body-contentTag標(biāo)簽body的類型display-name被可視化工具(諸如Jbuilder)用來顯示的名稱(可選)small-icon被可視化工具(諸如Jbuilder)用來顯示的小圖標(biāo)(可選)large-icon被可視化工具(諸如Jbuilder)用來顯示的大圖標(biāo)(可選)description此tag標(biāo)簽的描述variable提供腳本變量的信息(同tei-class)(可選)

18、attributeTag標(biāo)簽的屬性名以下章節(jié)介紹對于不同類型的tag,如何具體地實現(xiàn)它們。簡單的tagtag處理類簡單的tag處理類必須實現(xiàn)Tag接口的doStartTag和doEndTag方法。當(dāng)jsp引擎碰到tag標(biāo)簽的開頭時,doStartTag被調(diào)用,因為簡單的tag沒有body,所以此方法將返回 SKIP_BODY。當(dāng)jsp引擎碰到tag標(biāo)簽的結(jié)尾時,doEndTag被調(diào)用,如果余下的頁面還要被計算,那它將返回EVAL_PAGE,否則將會返回SKIP_PAGE。 以下是例子:對于標(biāo)簽 <tt:simple /> ,它的tag處理類實現(xiàn)如下:public SimpleTag

19、 extends TagSupportpublic int doStartTag() throws JspExceptiontrypageContext.getOut().print(“Hello.”);catch(Exception e)throw new JspTagException(“SimpleTag: “ + e.getMessage();return SKIP_BODY;public int doEndTag()return EVAL_PAGE;注意:如果tag標(biāo)簽沒有內(nèi)容的話,那必須定義body-content元素為空,例如<body-content>empty&l

20、t;/body-content>帶屬性的tag標(biāo)簽tag處理類對于tag標(biāo)簽的每個屬性,你必須依照J(rèn)avaBeans規(guī)范來定義其屬性,以及get和set方法。以struts的logic:present 標(biāo)簽為例,<logic:present parameter=”Clear”>與此相應(yīng),此tag處理類應(yīng)有如下方法和定義:protected String parameter = null;public String getParameter()return this.parameter;public void setParameter(String parameter)this

21、.parameter = parameter;注意:如果你的屬性名為id,而且你的tag處理類是從TagSupport類繼承的,那你就不需要定義它的屬性和set和get方法,因為他們早已在TagSupport被定義過了。Attribute元素對于tag標(biāo)簽的每個屬性,你必須定義它是否必須的,它的值是否可以用諸如<%= %>的表達(dá)式來獲得,以及它的類型(可選),如果不指定它的類型,那就默認(rèn)為是java.lang.String類型。如果rtexprvalue元素被定義為true或yes,那么在type元素中就定義了attribute的返回類型。<attribute><

22、name>attr1</name><required>true|false|yes|no</required><rtexprvalue>true|false|yes|no</rtexprvalue><type>attribute的返回類型(只用當(dāng)rtexprvalue為真是才有效)</type></attribute>如果tag的某個屬性不是必須的,那tag處理類會自動提供一個缺省值。例如,在logic:present這個tag標(biāo)簽中定義了一個屬性叫parameter,但它不是必須的,而且它可

23、以被諸如<%= %>的表達(dá)式來賦值。<tag><name>present</name><tag-class>org.apache.struts.taglib.logic.PresentTag</tag-class><body-content>JSP</body-content><attribute><name>parameter</name><required>false</required><rtexprvalue>true&

24、lt;/rtexprvalue></attribute></tag>屬性元素的校驗有關(guān)于tag標(biāo)簽的有效值可以從tag庫的說明文檔中獲得,當(dāng)JSP頁面被編譯時,jsp引擎會強(qiáng)制性地參照TLD中定義的規(guī)則進(jìn)行檢查。還有一個方法也可以進(jìn)行屬性元素的校驗,就是先繼承類TagExtraInfo,然后調(diào)用它的isValid方法。這個類同時也起到提供tag中定義的腳本變量信息的作用。IsValid方法通過TagData對象來傳遞屬性信息,它包括著tag的所有的屬性名值的信息。由于校驗發(fā)生在運行時刻,因此這個屬性的值將被賦值為TagData.REQUEST_TIME_VALUE

25、。例如tag標(biāo)簽<tt:twa attr1=”value1” />在TLD中定義如下:<attribute><name>attr1</name><required>true</required><rtexprvalue>true</rtexprvalue></attribute>這個定義說明了attr1能在運行期間被賦值。以下的isValid方法檢查attr1屬性的值是否屬于Boolean類型。注意由于attr1能在運行刻被賦值,那么isValid方法必須檢查tag用戶是否對此tag進(jìn)行

26、了運行時刻賦值。Public class TwaTEI extends TagExtraInfopublic boolean isValid(Tagdata data)Object o = data.getAttribute(“attr1”);If(o != null && o != TagData.REQUEST_TIME_VALUE)if( ( (String)o).toLowerCase().equals(“true”) |(String)o).toLowerCase().equals(“false”) )return true;elsereturn false;else

27、return true;帶body的tagtag處理類如果tag標(biāo)簽含有內(nèi)容,那處理方式會略微有些不同,而且還要視tag處理類是否要與body交互的情況而定。如果要與body交互,那我們認(rèn)為tag處理類要可能要對body進(jìn)行操作。Tag處理類不與body交互如果tag處理類不與body交互,tag處理類應(yīng)該實現(xiàn)Tag接口或從TagSupport中派生,如果body要被計算,那么doStartTag方法應(yīng)返回 EVAL_BODY_INCLUDE,否則應(yīng)返回SKIP_BODY。如果tag處理類要對body反復(fù)運算,則它應(yīng)該實現(xiàn)IterationTag或從TagSupport中派生。如果tag處理類

28、認(rèn)為body還未計算完的話,那它的doStartTag方法和doAfterBody方法必須返回EVAL_BODY_AGAIN。Tag處理類與body交互如果tag處理類與body交互,那tag處理類應(yīng)實現(xiàn)BodyTag接口或從BodyTagSupport中派生。這種tag處理類一般要實現(xiàn)doInitBody和doAfterBody方法。Body允許一些方法來讀寫它的內(nèi)容。Tag處理類可以調(diào)用body內(nèi)容的getString或getReader方法來從body中提取信息,也可用 writeOut(out) 方法來將body的內(nèi)容寫入到out對象中。其中out對象通過tag處理類的getPrevi

29、ousOut方法來獲得。 如果body的內(nèi)容需要被計算,那么doStartTag方法必須返回EVAL_BODY_BUFFERED,否則,它將返回 SKIP_BODY。doInitBody 方法此方法在body內(nèi)容已經(jīng)設(shè)好,但未被計算之前被調(diào)用。你可以根據(jù)不同的body內(nèi)容來制定初始化策略。doAfterBody方法此方法在body內(nèi)容已被計算后進(jìn)行調(diào)用。和doStartTag方法一樣,doAfterBody方法返回一個指示符指示是否要繼續(xù)計算body,如果要繼續(xù)計算,則doAfterBody應(yīng)返回EVAL_BODY_BUFFERED,否則,它應(yīng)返回SKIP_BODY。release 方法tag

30、處理類調(diào)用此方法將它的狀態(tài)重置為初始狀態(tài),并釋放所有的私有資源。以下的例子讀取body的內(nèi)容(其中含有一條sql語句),然后將它傳遞給一個對象,讓它進(jìn)行查詢。由于此處body不須重新計算,所以doAfterBody會返回SKIP_BODY。Public class QueryTag extends BodyTagSupportpublic int doAfterBody() throws JspTagExceptionBodyContent bc = getBodyContent();/將body的內(nèi)容以字符串的格式提取出來String query = bc.getString();/清除bo

31、dybc.clearBody();tryStatement stmt = connection.createStatement();Result result = stmt.executeQuery(query);catch(SQLException e)throw new JspTagException(“queryTag: “ + e.getMessage() );return SKIP_BODY;body-content元素由于tag可能會有body,你必須用body-content元素來指定body內(nèi)容的類型:<body-content>JSP|tagdependent&l

32、t;/body-content>如果body的內(nèi)容是定制的或內(nèi)部的tag、腳本元素、或HTML廣本,則歸類為JSP類型。其他的類型,比如上面代碼所述的?D?D將sql statement類傳給 query tag的這種類型應(yīng)該標(biāo)為tagdependent。注意:實際上body-content的值并不影響tag處理類對body內(nèi)容的處理,它僅僅是被tag編輯工具用來描述此body的內(nèi)容。用tags定義腳本變量tag處理類tag處理類負(fù)責(zé)創(chuàng)建或設(shè)置頁面中定義的腳本變量,用pageContext.setAttribute(name,value,scope)或pageContext.setAtt

33、ribute(name,value)方法來實現(xiàn)。一般來說,tag處理類通過腳本變量的名稱來獲取它,腳本變量的名稱一般可用get方法來獲得。如果腳本變量的值依賴于tag處理類中的上下文中某一對象,那它可用pageContext.getAttribute(name,scope)方法來找到那個對象。一般的處理過程是tag處理類先找到腳本變量,再對其進(jìn)行處理,然后用pageContext.setAttribute(name,object)的方法來設(shè)置它的新值。對象的生存周期(scope)如下表:對象的生存周期表名字可訪問范圍生存周期page當(dāng)前頁面一直有效,除非頁面向客戶提交響應(yīng)或重定向到一個新頁面r

34、equest當(dāng)前頁面或當(dāng)前頁面重定向到的頁面一直有效,除非頁面向客戶提交響應(yīng)session當(dāng)前頁面或在同一瀏覽器窗口中的頁面一直有效,除非關(guān)閉當(dāng)前瀏覽器、超時、網(wǎng)絡(luò)故障application整個web應(yīng)用程序的所有請求一直有效,除非發(fā)生網(wǎng)絡(luò)故障、服務(wù)器故障提供關(guān)于腳本變量的信息以下示例定義了一個名為“book”的腳本變量,用來訪問程序中關(guān)于書的信息:<bean:define id=”book” name=”bookDB” property=”bookDetails” type=”database.BookDetails” /><font color=”red” size=”+

35、2” ><%= messages.getString(“CartRemoved”) %><strong><jsp:getProperty name=”book” property=”title” /></strong></font>當(dāng)包含此tag的JSP頁面被編譯時,jsp引擎會自動生成關(guān)于此book的同步的代碼(同步可以避免幾個客戶同時訪問此book時造成的沖突),要生成同步代碼,jsp引擎需要知道此腳本變量的如下信息:· 腳本變量名稱· 腳本變量所屬的類· 此腳本變量是否引用了一個新的或已存在的

36、對象· 此腳本變量的有效性有兩種辦法可以向jsp引擎提供關(guān)于腳本變量的信息:在TLD中定義variable子元素,或用tei-class子元素定義一個額外tag信息類。用variable最簡單,但可能降低了一些靈活性。Variable元素Variable元素有如下子元素:· name-given ?D?D 給出的名字,是一個常量· name-from-attribute?D?D 屬性名,在編譯時給出的屬性名name-given或name-from-attribute兩者必須選一,但以下子元素是可選的:· variable-class?D?D變量的類型,缺

37、省為java.lang.String。· declare?D?D此腳本變量是否引用了一個新對象,缺省為True。· scope?D?D腳本變量的范圍,缺省為NESTED。下表描述了scope的幾種類型:腳本變量的有效范圍值有效性方法NESTED在tag標(biāo)簽的開始和結(jié)束之間如果tag處理類實現(xiàn)BodyTag接口,則在doInitBody和doAfterBody中調(diào)用,否則在doStartTag中調(diào)用AT_BEGIN從tag標(biāo)簽的開始一直到頁面結(jié)束如果tag處理類實現(xiàn)BodyTag接口,則在doInitBody、doAfterBody和doEndTag中調(diào)用,否則在doStar

38、tTag和doEndTag中調(diào)用AT_END從tag標(biāo)簽的結(jié)束一直到頁面結(jié)束在doEndTag中調(diào)用以struts為例,它的bean:define標(biāo)簽的實現(xiàn)遵循JSP1.1規(guī)范,此規(guī)范要求使用額外tag信息類來定義腳本變量。Variable元素是JSP1.2規(guī)范中加入的。以bean:define標(biāo)簽為例,你可以定義如下variable元素:<tag><variable><name-from-attribute>id</name-from-attribute><variable-class>database.BookDetails<

39、;/variable-class> <declare>true</declare><scope>AT_BEGIN</scope></variable></tag>額外tag信息類如果要定義一個額外tag信息類,你要繼承javax.servlet.jsp.TagExtraInfo類。一個TagExtraInfo類必須實現(xiàn)getVariableInfo方法,此方法返回一個叫VariableInfo的數(shù)組類,它包括如下信息:· 變量名· 變量所屬類名· 此變量是否引用了一個新對象·

40、此變量的有效范圍jsp引擎將一個名為data的參數(shù)傳給getVariableInfo方法,data中包括tag標(biāo)簽中的所有“屬性名?D?D屬性值”對。它可以用來向VariableInfo對象提供腳本變量的名字和類名。以struts為例,它在bean:define標(biāo)簽中定義了一個名為DefineTei的額外tag信息類,用來向腳本變量提供信息。由于腳本變量的名稱(book)和類名(database.BookDetails)是通過tag標(biāo)簽的屬性來傳遞的,它們一般定義在VariableInfo的構(gòu)建代碼中,并且可用data.getAttributeString方法來得到這些信息。如果要允許book

41、腳本變量能在從tag開始直到整個JSP頁面結(jié)束的范圍內(nèi)都可用的話,那它的范圍應(yīng)設(shè)為AT_BEGIN。如下所示:public class DefineTei extends TagExtraInfopublic VariableInfo getVariableInfo(TagData data)String type = data.getAttributeString(“type”);If( type = null)type = “java.lang.Object”;return new VariableInfo new VariableInfo(data.getAttributeString(

42、“id”),type,true,VariableInfo.AT_BEGIN);注意:關(guān)于額外tag信息類的類名必須要在TLD中的tag標(biāo)簽下的tei-class子元素中定義。因此,DefineTei的tei-class中的定義看起來如下:<tei-class></tei-class>具有協(xié)作關(guān)系的tagtag通過共享對象來進(jìn)行協(xié)作,JSP技術(shù)支持2種方式的對象共享。第一種方法是使用pageContext對象進(jìn)行對象的共享(可支持JSP頁面和tag處理類之間的共享),如果在一個tag處理類中要調(diào)用由另一個tag處理類創(chuàng)建的對象,可調(diào)用pageContext.getAttribute(name, scope)方法。第二各方式的共享是對于tag之間有嵌套關(guān)系而言的,外層的tag所創(chuàng)建的對象對于內(nèi)層的tag來說是可以共用的。這種形式的共享的好處是減少了可能存在的重名沖突。要訪問一個嵌套tag創(chuàng)建的對象,tag處理類必須先找到此嵌套tag對象,可用TagSupport的靜態(tài)方法 TagSupport.findAncestorWit

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論