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

下載本文檔

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

文檔簡(jiǎn)介

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

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

3、ag標(biāo)簽的tag庫(kù)實(shí)現(xiàn)此tag標(biāo)簽聲明tag標(biāo)簽所在的tag庫(kù)如果要使用tag標(biāo)簽,則應(yīng)用JSP的taglib指示符來(lái)指定其tag庫(kù)(注意:taglib要在在使用此tag標(biāo)簽之前聲明)<% taglib uri= ” /WEB-INF/tutorial- template.tld ” prefix= ” tt ” %>uri屬性定義了唯一的標(biāo)簽庫(kù)描述(以下簡(jiǎn)稱(chēng)TLD),它可以是直接是tld文件名或一個(gè)獨(dú)一無(wú)二的名字。prefix是用來(lái)區(qū)別其它 TLD中和本TLD中有重名的tag的一種手段。TLD必須以.tld 作為擴(kuò)展名,并且存放在當(dāng)前應(yīng)用的WEB-INF目錄或其子目錄下。你可以通

4、過(guò)它的文件名直接引用它,也可以通過(guò)別的方式間接地引用它。以下taglib 指示符直接引用一個(gè) TLD<% taglib uri= ” /WEB-INF/tutorial- template.tld ” prefix= ” tt ” %>以下的taglib 指示符通過(guò)一個(gè)邏輯名稱(chēng)間接地引用一個(gè)TLD<% taglib uri= ” /tutorial -template ” prefix= ” tt ” %>如果是間接引用TLD的話,那你必須還要在web.xml中定義此邏輯名稱(chēng)與tld文件之間的映射,具體做法是在web.xml中加入一個(gè)名為taglib 的元素:<t

5、aglib><taglib-uri>/tutorial-template</taglib-uri><taglib-location>/WEB-INF/tutorial-template.tld</taglib-location></taglib>實(shí)現(xiàn)此tag標(biāo)簽為了實(shí)現(xiàn)tag標(biāo)簽,你有2種方法來(lái)存放tag處理類(lèi)。一、讓tag處理類(lèi)以.class的方式存放于當(dāng)前 應(yīng)用的 WEB-INF/class子目錄下,二、如果 tag處理類(lèi)是以JAR包的形式存在的話,那可以放在當(dāng)前應(yīng)用 的WEB-INF/lib目錄下,如果tag處理類(lèi)要在多個(gè)

6、應(yīng)用中共享,那么它就應(yīng)放在jsp服務(wù)器上的common/lib目錄下,對(duì)于 tomcat 來(lái)說(shuō),就是 tomcat/common/lib 目錄下。tag標(biāo)簽類(lèi)型自定義的tag標(biāo)簽遵循XML語(yǔ)法。它有一個(gè)開(kāi)始標(biāo)記和一個(gè)結(jié)束標(biāo)記,有的還有body (即文本節(jié)點(diǎn))<tt:tag>body</tt:tag>一個(gè)不帶body的tag標(biāo)簽如下:<tt:tag />簡(jiǎn)單的tag標(biāo)簽一個(gè)沒(méi)有body和屬性的tag標(biāo)簽如下:<tt:simple />帶屬性的tag標(biāo)簽自定義標(biāo)簽可以有自己的屬性。屬性一般在開(kāi)始標(biāo)記中定義,語(yǔ)法為attr= ” value ”。屬性的

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

8、BookDetails ”帶body的tag標(biāo)簽一個(gè)自定義標(biāo)簽可以包含其它自定義標(biāo)簽、腳本變量、HTMI#記或其它容在下述例子中,此 JSP頁(yè)面使用了 struts 的logic:present標(biāo)簽,如果些標(biāo)簽定義了parameter=Clear ”的屬性,則將清除購(gòu)物車(chē)的容,然后打印出一條信息:<logic:present parameter= ” Clear ”<% cart.clear(); %><font color= ” #ffOOOO ” size= ” +2' ><strong>你選擇了清除購(gòu)物車(chē)!v/strong>v/fo

9、nt>v/logic:present>到底是用屬性還是用body來(lái)傳遞信息?如上所述,我們既可以通過(guò)屬性,也可以通過(guò)body來(lái)傳遞信息。但一般來(lái)說(shuō),比較簡(jiǎn)單的類(lèi)型,如字符串或簡(jiǎn)單表達(dá)式最好米用屬性來(lái)傳遞信息。定義腳本變量的tag標(biāo)簽所謂腳本變量,是指JSP中可以調(diào)用的變量或?qū)ο蟆K捎?tag標(biāo)簽產(chǎn)生。以下示例闡述了一個(gè)tag標(biāo)簽定義了一個(gè)名為tx的由JNDI所定義的事務(wù)處理對(duì)象。腳本變量可以是ejb對(duì)象、事務(wù)、數(shù)據(jù)庫(kù)連接等等:<tt:lookup id= ” tx ” type= ” UserTransaction ” name=” java:comp/UserTransa

10、ction ” /><% tx.begin(); %>具有協(xié)作關(guān)系的tag標(biāo)簽自定義tag標(biāo)簽之間可以通過(guò)共享對(duì)象來(lái)實(shí)現(xiàn)協(xié)作。在下述例子中,標(biāo)簽 tagl創(chuàng)建了一個(gè)名為objl 的對(duì)象,在標(biāo)簽tag2仍可以重復(fù)使用obj。<tt:tag1 attr1= ” objl ” value 1= ” value ” /><tt:tag2 attr仁” objl” />在以下這個(gè)例子當(dāng)中,如果外層的tag標(biāo)簽創(chuàng)建了一個(gè)對(duì)象,那么其層的所有tag標(biāo)簽都可以使用這個(gè)對(duì)象。由于這樣產(chǎn)生的對(duì)象沒(méi)有一個(gè)指定的名字,那么就可以將少重名的沖突。這個(gè)例子闡述了一系列 協(xié)作的嵌套

11、對(duì)象。<tt:outerTag><tt:innerTag />v/tt:outerTag>Tag處理類(lèi)Tag處理類(lèi)必須實(shí)現(xiàn) Tag接口或BodyTag接口,不過(guò)現(xiàn)在一般都流行從 TagSupport或BodyTagSupport 類(lèi)中繼承,這些類(lèi)或接口都可以在包中找到。當(dāng)JSP引擎看到自己的JSP頁(yè)面中包含有tag標(biāo)簽時(shí),它會(huì)調(diào)用doStartTag方法來(lái)處理tag標(biāo)簽的開(kāi) 頭,調(diào)用doEndTag方法來(lái)處理tag標(biāo)簽的結(jié)束。下表說(shuō)明不同類(lèi)型的tag所需要不同的處理過(guò)程:Tag處理類(lèi)的方法Tag標(biāo)簽類(lèi)型所調(diào)用的方法基本標(biāo)簽doStartTag, doEndTag,

12、 release帶屬性的標(biāo)簽doStartTag, doEndTag, set/getAttribute1.N, release帶容的標(biāo)簽doStartTag, doEndTag, release帶容的標(biāo)簽,且容重復(fù)循環(huán)doStartTag, doAfterBody, doEndTag, release帶容的標(biāo)簽,且容與 JSP交互doStartTag, doEndTag, release, doInitBody, doAfterBody, release一個(gè) tag 處理類(lèi)可以通過(guò) 來(lái)與 JSP 交互,通過(guò)類(lèi),tag 處理類(lèi)可以訪問(wèn) JSP 中的 request、session 和 appl

13、ication 對(duì) 像。一般情況都將所有的tag處理類(lèi)打成了 JAR的包,以便于發(fā)布。Tag庫(kù)描述(簡(jiǎn)稱(chēng)TLD)Tag庫(kù)是用xml語(yǔ)言描述的,TLD包括了 tag庫(kù)中所有tag標(biāo)簽的描述,它一般用來(lái)被jsp服務(wù)器用來(lái) 校驗(yàn)tag的語(yǔ)確性,或者被jsp開(kāi)發(fā)者用來(lái)開(kāi)發(fā)新的標(biāo)簽。TLD的文件擴(kuò)展名必須為.tld ,而且必須放在當(dāng)前 WEB應(yīng)用的WEB-INF目錄或其子目錄中。一個(gè)TLD的容的開(kāi)頭必須遵守標(biāo)準(zhǔn)的XML開(kāi)頭,用于描述 DTD和xml的版本,例如:v?xml version="1.0" encoding="ISO-8859-1" ?><!

14、DOCTYPE taglib PUBLIC "-/Sun Microsystems, lnc./DTD JSP Tag Library 1.2/EN" "java.sun./dtd/web-jsptaglibrary_1_2.dtd"TLD必須以taglib來(lái)作為它的根元素,taglib的子元素如下表:taglib 的子元素ElementDescriptiontlib-versionTag庫(kù)的版本jsp-versionTag庫(kù)所需要的jsp的版本short-name助記符,tag的一個(gè)別名(可選)uri用于確定一個(gè)唯一的tag庫(kù)display-name被

15、可視化工具(諸如Jbuilder )用來(lái)顯示的名稱(chēng)(可選)small-icon被可視化工具(諸如Jbuilder )用來(lái)顯示的小圖標(biāo)(可選)large-icon被可視化工具(諸如Jbuilder )用來(lái)顯示的大圖標(biāo)(可選)description對(duì)tag庫(kù)的描述(可選)listener參見(jiàn)下面listener 元素tag參見(jiàn)下面tag元素Listener 元素一個(gè)tag庫(kù)可能定義一些類(lèi)做為它的事件偵聽(tīng)類(lèi),這些類(lèi)在TLD中被稱(chēng)為listener 元素,jsp服務(wù)器將會(huì)實(shí)例化這些偵聽(tīng)類(lèi),并且注冊(cè)它們。Listener 元素中有一個(gè)叫l(wèi)istener-class的子元素,這個(gè)元素的值必須是該偵聽(tīng)類(lèi)的完

16、整類(lèi)名。Tag元素每個(gè)tag元素在tag庫(kù)中都要指岀它的名字、類(lèi)名、腳本變量、tag的屬性。其中腳本變量的值可以直接在TLD中定義或通過(guò)tag附加信息的類(lèi)來(lái)取得。每個(gè)屬性描述了這個(gè)屬性是否可以省略,它的值是否 可以通過(guò)<%= %>這樣的JSP語(yǔ)法來(lái)獲得,以及屬性的類(lèi)型。每一個(gè)tag 在TLD中對(duì)應(yīng)一個(gè)tag 元素,下表是 tag元素的子元素:Tag元素的子元素元素名稱(chēng)描述name獨(dú)一無(wú)二的元素名tag-classTag標(biāo)簽對(duì)應(yīng)的tag處理類(lèi)tei-classjavax.servlet.jsp.tagext.TagExtraInfo的子類(lèi),用于表達(dá)腳本變量(可選)body-conte

17、ntTag標(biāo)簽body的類(lèi)型display-name被可視化工具(諸如 Jbuilder )用來(lái)顯示的名稱(chēng)(可選)small-icon被可視化工具(諸如Jbuilder )用來(lái)顯示的小圖標(biāo)(可選)large-icon被可視化工具(諸如Jbuilder )用來(lái)顯示的大圖標(biāo)(可選)description此tag標(biāo)簽的描述variable提供腳本變量的信息(同 tei-class )(可選)attributeTag標(biāo)簽的屬性名以下章節(jié)介紹對(duì)于不同類(lèi)型的tag,如何具體地實(shí)現(xiàn)它們。簡(jiǎn)單的tagtag處理類(lèi)簡(jiǎn)單的tag處理類(lèi)必須實(shí)現(xiàn) Tag接口的doStartTag和doEndTag方法。當(dāng)jsp引擎碰

18、到tag標(biāo)簽的開(kāi) 頭時(shí),doStartTag被調(diào)用,因?yàn)楹?jiǎn)單的 tag沒(méi)有body,所以此方法將返回 SKIP_BODY當(dāng)jsp引擎碰到 tag標(biāo)簽的結(jié)尾時(shí),doEndTag被調(diào)用,如果余下的頁(yè)面還要被計(jì)算,那它將返回EVAL_PAGE否則將會(huì)返回SKIP_PAGE以下是例子:對(duì)于標(biāo)簽 <tt:simple /> ,它的tag處理類(lèi)實(shí)現(xiàn)如下:public SimpleTag extends TagSupportpublic int doStartTag() throws JspExceptiontrypageContext.getOut().print( “Hello. ” );c

19、atch(Exception e)throw new JspTagException( “SimpleTag: “ + e.getMessage();return SKIP_BODY;public int doEndTag()return EVAL_PAGE;<body-content>emptyv/body-content>帶屬性的tag標(biāo)簽tag處理類(lèi)對(duì)于tag標(biāo)簽的每個(gè)屬性,你必須依照 JavaBeans規(guī)來(lái)定義其屬性,以及 get和set方法。以struts 的logic:present 標(biāo)簽為例,<logic:present parameter= ” Clea

20、r ”與此相應(yīng),此tag處理類(lèi)應(yīng)有如下方法和定義:protected String parameter = null;public String getParameter()return this.parameter;public void setParameter(String parameter)this.parameter = parameter;注意:如果你的屬性名為id,而且你的tag處理類(lèi)是從TagSupport類(lèi)繼承的,那你就不需要定義它的屬性和set和get方法,因?yàn)樗麄冊(cè)缫言赥agSupport被定義過(guò)了。Attribute 元素對(duì)于tag標(biāo)簽的每個(gè)屬性,你必須定義它是否必須

21、的,它的值是否可以用諸如<%=>勺表達(dá)式來(lái)獲得,以及它的類(lèi)型(可選),如果不指定它的類(lèi)型,那就默認(rèn)為是類(lèi)型。如果rtexprvalue 元素被定義為true或yes,那么在type元素中就定義了 attribute的返回類(lèi)型。<attribute><name>attr1</name><required>true|false|yes|no</required><rtexprvalue>true|false|yes|no</rtexprvalue><type>attribute 的返回類(lèi)型(

22、只用當(dāng)rtexprvalue為真是才有效)</type></attribute>如果tag的某個(gè)屬性不是必須的,那 tag處理類(lèi)會(huì)自動(dòng)提供一個(gè)缺省值。例如,在logic:present 這個(gè)tag標(biāo)簽中定義了一個(gè)屬性叫parameter,但它不是必須的,而且它可以被諸如<%= %>勺表達(dá)式來(lái)賦值。<tag><name>present</name><body-content>JSP</body-content><attribute><name>parameter</nam

23、e><required>false</required><rtexprvalue>true</rtexprvalue>v/attribute></tag>屬性元素的校驗(yàn)有關(guān)于tag標(biāo)簽的有效值可以從tag庫(kù)的說(shuō)明文檔中獲得,當(dāng)JSP頁(yè)面被編譯時(shí),jsp引擎會(huì)強(qiáng)制性地參照TLD中定義的規(guī)則進(jìn)行檢查。還有一個(gè)方法也可以進(jìn)行屬性元素的校驗(yàn),就是先繼承類(lèi)TagExtralnfo ,然后調(diào)用它的isValid 方法。這個(gè)類(lèi)同時(shí)也起到提供tag中定義的腳本變量信息的作用。IsValid 方法通過(guò)TagData對(duì)象來(lái)傳遞屬性信息,它包括

24、著tag的所有的屬性名值的信息。由于校驗(yàn)發(fā)生在運(yùn)行時(shí)刻,因此這個(gè)屬性的值將被賦值為T(mén)agData.REQUEST_TIME_VALUE例如tag標(biāo)簽<tt:twa attr1= ” value1 ” />在TLD中定義如下:<attribute><name>attr1</name><required>true</required><rtexprvalue>true</rtexprvalue></attribute>這個(gè)定義說(shuō)明了 attr1能在運(yùn)行期間被賦值。以下的isValid 方法檢

25、查attr1屬性的值是否屬于 Boolean類(lèi)型。注意由于attr1能在運(yùn)行刻被賦值, 那么isValid 方法必須檢查tag用戶是否對(duì)此tag進(jìn)行了運(yùn)行時(shí)刻賦值。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 ”)|

26、(String)o).toLowerCase().equals(“false ” )return true;elsereturn false;elsereturn true;帶 body 的 tagtag處理類(lèi)如果tag標(biāo)簽含有容,那處理方式會(huì)略微有些不同,而且還要視tag處理類(lèi)是否要與body交互的情況 而定。如果要與body交互,那我們認(rèn)為tag處理類(lèi)要可能要對(duì) body進(jìn)行操作。Tag處理類(lèi)不與body交互如果tag處理類(lèi)不與body交互,tag處理類(lèi)應(yīng)該實(shí)現(xiàn) Tag接口或從TagSupport中派生,如果body要 被計(jì)算,那么doStartTag方法應(yīng)返回EVAL_BODY_INCL

27、UDE否則應(yīng)返回SKIP_BODY如果tag處理類(lèi)要對(duì)body反復(fù)運(yùn)算,則它應(yīng)該實(shí)現(xiàn) IterationTag 或從TagSupport中派生。如果tag 處理類(lèi)認(rèn)為body還未計(jì)算完的話,那它的doStartTag方法和doAfterBody方法必須返回EVAL_BODY_AGAINTag處理類(lèi)與body交互如果tag處理類(lèi)與body交互,那tag處理類(lèi)應(yīng)實(shí)現(xiàn) BodyTag接口或從BodyTagSupport中派生。這種 tag處理類(lèi)一般要實(shí)現(xiàn) doInitBody 和doAfterBody 方法。Body允許一些方法來(lái)讀寫(xiě)它的容。 Tag處理類(lèi)可以調(diào)用 body容的getString 或

28、getReader方法來(lái)從 body中提取信息,也可用 writeOut(out) 方法來(lái)將body的容寫(xiě)入到out對(duì)象中。其中out對(duì)象通過(guò)tag 處理類(lèi)的getPreviousOut 方法來(lái)獲得。如果body的容需要被計(jì)算,那么 doStartTag 方法必須返回 EVAL_BODY_BUFFERE否則,它將返回 SKIP_BODYdoInitBody 方法此方法在body容已經(jīng)設(shè)好,但未被計(jì)算之前被調(diào)用。你可以根據(jù)不同的body容來(lái)制定初始化策略。doAfterBody 方法此方法在body容已被計(jì)算后進(jìn)行調(diào)用。和doStartTag方法一樣,doAfterBody方法返回一個(gè)指示符指示

29、是否要繼續(xù)計(jì)算body,如果要繼續(xù)計(jì)算,貝U doAfterBody 應(yīng)返回 EVAL_BODY_BUFFERE否貝U,它應(yīng)返回 SKIP_BODYrelease 方法tag處理類(lèi)調(diào)用此方法將它的狀態(tài)重置為初始狀態(tài),并釋放所有的私有資源。以下的例子讀取body的容(其中含有一條 sql語(yǔ)句),然后將它傳遞給一個(gè)對(duì)象,讓它進(jìn)行查詢。由 于此處body不須重新計(jì)算,所以 doAfterBody會(huì)返回SKIP_BODYPublic class QueryTag extends BodyTagSupportpublic int doAfterBody() throws JspTagExceptionB

30、odyContent bc = getBodyContent();/將body的容以字符串的格式提取出來(lái)String query = bc.getString();/清除bodybc.clearBody();tryStatement stmt = connection.createStatement();Result result = stmt.executeQuery(query);catch(SQLException e)throw new JspTagException(“queryTag:“ + e.getMessage();return SKIP_BODY;body-content

31、元素由于tag可能會(huì)有body,你必須用body-content元素來(lái)指定body容的類(lèi)型: <body-content>JSP|tagdependent</body-content>如果body的容是定制的或部的tag、腳本元素、或 HTML廣本,則歸類(lèi)為JSP類(lèi)型。其他的類(lèi)型,比 如上面代碼所述的 ?D?D將sql statement 類(lèi)傳給query tag的這種類(lèi)型應(yīng)該標(biāo)為 tagdependent。注意:實(shí)際上body-content的值并不影響tag處理類(lèi)對(duì)body容的處理,它僅僅是被tag編輯工具用 來(lái)描述此body的容。用tags定義腳本變量tag處理類(lèi)

32、tag處理類(lèi)負(fù)責(zé)創(chuàng)建或設(shè)置頁(yè)面中定義的腳本變量,用pageContext.setAttribute(name,value,scope)或pageContext.setAttribute(name,value)方法來(lái)實(shí)現(xiàn)。一般來(lái)說(shuō),tag處理類(lèi)通過(guò)腳本變量的名稱(chēng)來(lái)獲取它,腳本變量的名稱(chēng)一般可用get方法來(lái)獲得。如果腳本變量的值依賴(lài)于tag 處理類(lèi)中的上下文中某一對(duì)象,那它可用 pageContext.getAttribute(name,scope)方法來(lái)找到那個(gè)對(duì)象。一般的處理過(guò)程是tag處理類(lèi)先找到腳本變量,再對(duì)其進(jìn)行處理,然后用pageContext.setAttribute(name,ob

33、ject)的方法來(lái)設(shè)置它的新值。對(duì)象的生存周期(scope)如下表: 對(duì)象的生存周期表名字可訪問(wèn)圍生存周期page當(dāng)前頁(yè)面一直有效,除非頁(yè)面向客 戶提交響應(yīng)或重定向到 一個(gè)新頁(yè)面request當(dāng)前頁(yè)面或當(dāng)前頁(yè)面重定向到的頁(yè)面一直有效,除非頁(yè)面向客戶提交響應(yīng)session當(dāng)前頁(yè)面或在同一瀏覽 器窗口中的頁(yè)面一直有效,除非關(guān)閉當(dāng)前瀏覽器、超時(shí)、網(wǎng)絡(luò)故障application整個(gè)web應(yīng)用程序的所 有請(qǐng)求一直有效,除非發(fā)生網(wǎng)絡(luò)故障、服務(wù)器故障提供關(guān)于腳本變量的信息以下示例定義了一個(gè)名為“ book ”的腳本變量,用來(lái)訪問(wèn)程序中關(guān)于書(shū)的信息:<bean:defineid= ” book”name

34、= bookDBproperty= ” bookDetailstype= ” database.BookDetails ” /><font color= ” red ” size= ” +2' ><%= messages.getString( “CartRemovec” ) %>ng><strong>vjsp:getProperty name= ” book” property= ” title ” /></stro v/font>當(dāng)包含此tag的JSP頁(yè)面被編譯時(shí),jsp引擎會(huì)自動(dòng)生成關(guān)于此 book的同步的代碼(同步

35、可以避免幾 個(gè)客戶同時(shí)訪問(wèn)此book時(shí)造成的沖突),要生成同步代碼,jsp弓I擎需要知道此腳本變量的如下信息:腳本變量名稱(chēng)腳本變量所屬的類(lèi)此腳本變量是否引用了一個(gè)新的或已存在的對(duì)象此腳本變量的有效性有兩種辦法可以向jsp引擎提供關(guān)于腳本變量的信息:在TLD中定義variable 子元素,或用tei-class子元素定義一個(gè)額外tag信息類(lèi)。用variable 最簡(jiǎn)單,但可能降低了一些靈活性。Variable 元素Variable 元素有如下子元素: name-given ?D?D 給出的名字,是一個(gè)常量 name-from-attribute?D?D屬性名,在編譯時(shí)給出的屬性名name-giv

36、en 或 name-from-attribute兩者必須選一,但以下子元素是可選的: variable-class?D?D變量的類(lèi)型,缺省為 。 declare?D?D此腳本變量是否引用了一個(gè)新對(duì)象,缺省為T(mén)rue。 scope?D?D腳本變量的圍,缺省為 NESTED下表描述了 scope的幾種類(lèi)型:腳本變量的有效圍值有效性方法NESTED在tag標(biāo)簽的開(kāi)始和結(jié) 束之間如果tag處理類(lèi)實(shí)現(xiàn) BodyTag接口,則在 dolnitBody和doAfterBody中調(diào)用,否 則在doStartTag中調(diào)用AT_BEGIN從tag標(biāo)簽的開(kāi)始一直 到頁(yè)面結(jié)束如果tag處理類(lèi)實(shí)現(xiàn)BodyTag接口,則

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

38、><variable-class>database.BookDetails</variable-class><declare>true</declare><scope>AT_BEGIN</scope></variable></tag>額外tag信息類(lèi)如果要定義一個(gè)額外 tag信息類(lèi),你要繼承類(lèi)。一個(gè)TagExtraInfo類(lèi)必須實(shí)現(xiàn)getVariableInfo 方法,此方法返回一個(gè)叫 Variableinfo的數(shù)組類(lèi),它包括如下信息:變量名變量所屬類(lèi)名此變量是否引用了一個(gè)新對(duì)象此變量的有效圍

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

40、要允許book腳本變量能在從tag開(kāi)始直到整個(gè)JSP頁(yè)面結(jié)束的圍都可用的話, 那它的圍應(yīng)設(shè) 為AT_BEGIN如下所示:public class DefineTei extends TagExtraInfopublic VariableInfo getVariablelnfo(TagData data)String type = data.getAttributeString(“type ” );If( type = null)type =“java .l ang.Object”;return new VariableInfo new VariableInfo(data.getAttribut

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

溫馨提示

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

評(píng)論

0/150

提交評(píng)論