版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、jsp自定義標簽的開發(fā)與應(yīng)用在jstl提供了四個標簽庫(核心標簽庫、國際化標簽庫、數(shù)據(jù)庫標簽庫和xml標簽庫),涉及到了幾十個標簽。雖然這些標簽可以完成比較復(fù)雜的工作,但它們?nèi)匀粺o法滿足程序中的特殊需求。因此,就需要用戶根據(jù)自己的需要來定制jsp標簽,這種由用戶自己實現(xiàn)的jsp標簽被稱為自定義標簽。 .1 自定義標簽基礎(chǔ) 自定義標簽和jstl中的標簽從技術(shù)上看沒有任何區(qū)別,可以將這些標簽統(tǒng)稱為jsp標簽。jsp標簽在jsp頁面中通過xml語法格式被調(diào)用,當jsp引擎將jsp頁面翻譯成servlet時,就將這些調(diào)用轉(zhuǎn)換成執(zhí)行相應(yīng)的java代碼。也就是說,jsp標簽實際上就是調(diào)用了某些java代碼
2、,只是在jsp頁面中以另外一種形式(xml語法格式)表現(xiàn)出來。 1.1 編寫輸出隨機數(shù)的標簽 開始自定義標簽的學(xué)習(xí)之前,在這一節(jié)先來實現(xiàn)一個簡單的自定義標簽,以使讀者做一下熱身,同時讀者通過本節(jié)的例子可以對自定義標簽的實現(xiàn)方法和過程有一個感性的認識。 【實例1-1】 實現(xiàn)輸出隨機數(shù)的標簽 1. 實例說明 在本例實現(xiàn)的自定義標簽(random標簽)的功能是輸出一個指定范圍的隨機整數(shù)。random標簽有如下幾個特征: 沒有標簽體。 有兩個屬性:min和max。其中min屬性表示生成隨機數(shù)的最小值,max屬性表示生成隨機數(shù)的最大值。min屬性的默認值是0,max屬性的默認值是integer.max_
3、value。 生成隨機數(shù)的范圍是min = random max。 random標簽的標準調(diào)用形式如下: 其中“ct”是調(diào)用標簽時的前綴,通過taglib指定的prefix屬性指定。上面的代碼的功能是輸出一個在1(包括)和100(不包括)之間的隨機數(shù)。 2. 編寫標簽類 標簽類是自定義標簽的核心部分。實現(xiàn)標簽類的方法有很多,但最簡單的方法是編寫一個從javax.servlet.jsp.tagext.tagsupport類繼承的java類,并在該類中覆蓋tagsupport類的dostarttag方法。為了讀取標簽中的屬性值,還需要在標簽類中為每一個標簽屬性提供一個相應(yīng)數(shù)據(jù)類型的標簽類屬性以及該
4、屬性的setter方法(不需要getter方法)。生成隨機數(shù)的代碼需要放在標簽類的dostarttag方法中。該標簽類的實現(xiàn)代碼如下: package chapter1; import java.io.ioexception; import java.util.random; import javax.servlet.jsp.jspexception; import javax.servlet.jsp.tagext.tagsupport; public class randomtag extends tagsupport / 封裝random標簽的兩個屬性的javabean屬性 private
5、 int min = 0; private int max = integer.max_value; / min屬性的setter方法 public void setmin(int min) this.min = min; / max屬性的setter方法 public void setmax(int max) this.max = max; / 覆蓋tagsupport類的dostarttag方法 / 當遇到標簽(也就是)的開始標記時調(diào)用該方法 override public int dostarttag() throws jspexception try random random = n
6、ew random(); / 生成一個在min和max之間的隨機數(shù) int result = min + random.nextint(max - min); / 將生成的隨機數(shù)輸出到客戶端 pagecontext.getout().write(string.valueof(result); catch (ioexception e) / tagsupport類的dostarttag方法默認返回skip_body,表示忽略自定義標簽體 return super.dostarttag(); 在randomtag類的dostarttag方法中使用了一個pagecontext變量來獲得jspwrit
7、er對象(jsp的out內(nèi)置對象)。pagecontext變量是在tagsupport類中定義的一個類變量,該變量通過tagsupport類中的setpagecontext方法進行賦值。實際上,setpagecontext方法是在tag接口中定義的,而tagsupport實現(xiàn)了tag接口的setpagecontext方法。servlet容器在調(diào)用dostarttag方法之前,會先調(diào)用tag接口的setpagecontext方法來初始化pagecontext變量。tag接口將在1.1.3節(jié)介紹,在這里只要知道所有的標簽類都必須實現(xiàn)tag接口。為了簡化標簽類的實現(xiàn),jsp api提供了一個tags
8、upport類,有了tagsupport類,用戶在編寫標簽類時就不需要實現(xiàn)tag接口的所有方法了。 3. 編寫標簽庫描述符文件(tld文件) 在jstl中有若干tld文件(詳見圖9.1),其中tld是tag library descriptor(標簽庫描述符)的縮寫。要想使一個自定義標簽正常工作,必須在tld文件中對該標簽進行配置。在tld文件中主要配置如下兩部分內(nèi)容: 標簽庫的配置信息、標簽庫中具體標簽的配置信息 標簽庫的配置信息主要包括如下的內(nèi)容: 標簽庫的版本:使用標簽設(shè)置。 正常使用標簽庫中的標簽所需要的最低jsp版本:使用標簽設(shè)置。 標簽庫的默認前綴:使用標簽設(shè)置。 標簽庫的uri:
9、使用標簽設(shè)置。 標簽庫的描述信息:使用標簽設(shè)置。 標簽的配置信息主要包括如下的內(nèi)容: 標簽名:使用標簽設(shè)置。 標簽對應(yīng)的java類:使用標簽設(shè)置。 標簽體的類型:使用標簽設(shè)置。 標簽的描述信息:使用標簽設(shè)置。 標簽屬性的信息:每一個標簽屬性對應(yīng)一個標簽。在標簽中可以指定標簽名(使用標簽設(shè)置)、該屬性是否必須指定(使用標簽設(shè)置)、該屬性是否支持動態(tài)屬性值(使用標簽指定)等配置信息。 在web-inf目錄中建立一個jsp-taglib.tld文件,并在該文件中輸入如下的內(nèi)容: 自定義標簽庫 1.1 ct 產(chǎn)生一個指定范圍的隨機數(shù) random chapter1.randomtag empty mi
10、n false false max false false 上面的配置代碼分為三部分:標簽庫描述符文件頭、標簽庫配置信息和random標簽的配置信息。其中描述庫文件頭的內(nèi)容并不需要讀者去記憶,讀者只需要將jstl中的任何一個tld文件打開,將其中的標簽庫描述文件頭部分復(fù)制過來即可。如果在標簽庫描述符文件中包含中文,需要將encoding屬性改成“utf-8”或“gbk”。 標簽庫的uri被元素指定為“”,該標簽值就是taglib指令的uri屬性值。元素指定了標簽庫的默認前綴。要注意的是,該默認前綴并不等于taglib指令的prefix屬性值,也就是說,taglib指令的prefix屬性值和元素
11、的值毫無關(guān)系。元素值實際上只是個推薦的標簽庫前綴,如國際化標簽庫的描述符文件(fmt.tld)中的元素值是“fmt”。在使用taglib指令引用某個標簽庫時,應(yīng)盡量使用元素推薦的標簽庫前綴,當然,也可以設(shè)置其他的前綴名。 random標簽的標簽體類型為“empty”(元素的值),表示該標簽不支持標簽體。關(guān)于元素支持的其他值,將在后面的部分詳細介紹。random標簽的min屬性和max屬性都被設(shè)置可選的屬性,并且都不支持動態(tài)屬性值。因此,在jsp頁面中設(shè)置random標簽的這兩個屬性時只能直接為它們賦值。 4. 測試random標簽 在chapter1目錄建立一個random.jsp文件(在本章
12、的所有jsp文件都放在該目錄下),并輸入如下的內(nèi)容: 在瀏覽器地址欄中輸入如下的url: http:/localhost:8080/demo/chapter1/random.jsp 瀏覽器顯示的輸出結(jié)果如圖1.1所示。 圖1.1 使用random標簽產(chǎn)生1個10至200之間的隨機數(shù) 5. 程序總結(jié) 在部署和安裝自定義標簽時,tld文件應(yīng)放在web-inf目錄或其子目錄中(包括classes和lib目錄)。根據(jù)本例實現(xiàn)的random標簽,可以將開發(fā)自定義標簽的基本步驟總結(jié)如下: 實現(xiàn)一個標簽類。該標簽類可以實現(xiàn)tag接口、繼承tagsupport類或?qū)崿F(xiàn)其他的接口(這些接口將在后面的部分詳細介紹
13、)。 在標簽庫描述符文件(tld文件)中配置自定義標簽。 部署和安裝自定義標簽。主要是將.class文件放在web-infclasses目錄中,并且將tld文件放在web-inf目錄或其子目錄中。 1.1.2 自定義標簽?zāi)茏鍪裁?自定義標簽除了可以讀取標簽的屬性值外,還可以完成如下的工作: 單次執(zhí)行標簽體中的內(nèi)容、重復(fù)執(zhí)行標簽體中的內(nèi)容。 修改標簽體中的內(nèi)容。 忽略jsp頁面中位于自定義標簽后面的內(nèi)容。 在上一節(jié)介紹了tag接口中的dostarttag方法,該方法在web容器執(zhí)行到自定義標簽的開始標記時被調(diào)用。除了這個方法,在tag接口中還有doendtag方法,該方法在web容器中執(zhí)行到自定
14、義標簽的結(jié)束標記時被調(diào)用。 dostarttag方法可以通過返回如下兩個值來控制web容器是否執(zhí)行自定義標簽的標簽體: eval_body_include:執(zhí)行自定義標簽的標簽體。 skip_body:忽略(不執(zhí)行)自定義標簽的標簽體。 doendtag方法可以通過返回如下兩個值來控制web容器是否忽略jsp頁面中位于自定義標簽后面的內(nèi)容: eval_page:繼續(xù)執(zhí)行自定義標簽后面的內(nèi)容。 skip_page:忽略自定義標簽后面的內(nèi)容。 其中eval_body_include、skip_body、eval_page和skip_page是在tag接口中定義的整型常量,所有實現(xiàn)tag接口的類都可
15、以直接使用這些常量。 除此之外,實現(xiàn)iterationtag接口的標簽類還可以重復(fù)執(zhí)行標簽體。iterationtag是tag接口的子接口。在iterationtag接口中有一個doafterbody方法,該方法可以通過返回如下兩個值來決定是否重復(fù)執(zhí)行自定義標簽體的內(nèi)容: eval_body_again:重復(fù)執(zhí)行標簽體的內(nèi)容。 skip_body:不再執(zhí)行標簽體的內(nèi)容。 其中eval_body_again是在iterationtag接口中定義的整型常量。如果doafterbody方法返回skip_body,web容器會繼續(xù)執(zhí)行自定義標簽的結(jié)束標記,同時會調(diào)用doendtag方法。 從上面的描述
16、可以將web容器執(zhí)行自定義標簽的過程總結(jié)如下: 1. web容器首先會執(zhí)行自定義標簽的開始標記,同時會調(diào)用標簽類的dostarttag方法。 2. 如果dostarttag方法返回eval_body_include,web容器在執(zhí)行完標簽體的內(nèi)容后,會調(diào)用標簽類的doafterbody方法;如果dostarttag方法返回skip_body,doafterbody方法不會被調(diào)用,web容器會直接調(diào)用標簽類的doendtag方法。 3. 如果doafterbody方法被調(diào)用,并且該方法返回eval_body_again,web容器會再次執(zhí)行標簽體的內(nèi)容;如果doafterbody方法返回skip
17、_body,web容器會調(diào)用標簽類的doendtag方法。 4. 如果doendtag方法返回eval_page,web容器會執(zhí)行自定義標簽后面的內(nèi)容;如果doendtag方法返回skip_page,web容器會忽略自定義標簽后面的內(nèi)容。 1.1.3 自定義標簽api 自定義標簽api中除了前面介紹的tag接口和iterationtag接口外,還有另外三個核心接口:jsptag、bodytag和simpletag。為了簡化自定義標簽的編程工作,在自定義標簽api中提供了tagsupport類、simpletagsupport類和bodytagsupport類。其中tagsupport類實現(xiàn)了i
18、terationtag接口,simpletagsupport類實現(xiàn)了simpletag接口,bodytagsupport類是tagsupport的子類,并實現(xiàn)了bodytag接口。上述五個接口和三個類的關(guān)系如圖1.2所示。 圖1.2 自定義標簽api的核心接口和類的關(guān)系圖 上述的接口和類都在javax.servlet.jsp.tagext包中,讀者可以從如下的網(wǎng)址來查詢這些接口和類的詳細介紹: 訪問上面的網(wǎng)址將得到如圖1.3所示的頁面。 圖1.3 自定義標簽api的官方文檔 上述五個接口的功能和作用如下: 1. jsptag接口 jsptag接口是所有自定義標簽的父接口。它沒有任何屬性和方法。
19、tag接口和simpletag接口是jsptag的兩個直接子接口。其中jsptag和simpletag是jsp2.0新增的接口。在jsp2.0之前的版本的所有自定義標簽的父接口是tag。因此,可以將所有實現(xiàn)tag接口的自定義標簽稱為傳統(tǒng)標簽,把所有實現(xiàn)simpletag接口的標簽稱為簡單標簽。在本章主要介紹傳統(tǒng)標簽,簡單標簽將在下一章詳細介紹。 2. tag接口 tag接口是所有傳統(tǒng)標簽的父接口。該接口有兩個核心方法(dostarttag和doendtag)以及四個常量(eval_body_include、skip_body、eval_page和skip_page)。其中dostarttag方
20、法可以返回eval_body_include和skip_body,用于控制web容器是否執(zhí)行標簽體的內(nèi)容;doendtag方法可以返回eval_page和skip_page,用于控制web容器是否執(zhí)行自定義標簽后面的內(nèi)容。 3. iterationtag接口 iterationtag接口繼承了tag接口。iterationtag接口可用于實現(xiàn)需要循環(huán)執(zhí)行標簽體內(nèi)容的自定義標簽。在iterationtag接口中只有一個doafterbody方法和一個eval_body_again常量。doafterbody方法通過返回eval_body_again常量或tag接口中的skip_body常量來控制
21、web容器是否重復(fù)執(zhí)行標簽體中的內(nèi)容。dostarttag方法、doafterbody方法和doendtag方法的調(diào)用關(guān)系詳見1.1.2節(jié)中的介紹。 并不是每一個自定義標簽都需要循環(huán)執(zhí)行標簽體的內(nèi)容,或是控制自定義標簽后面的內(nèi)容是否被執(zhí)行。因此,jsp api中提供了一個實現(xiàn)iterationtag接口的tagsupport類。在tagsupport類中對tag接口和iterationtag接口中定義的方法都提供了默認的實現(xiàn)。如dostarttag方法、doendtag方法和doafterbody方法都提供了默認的返回值,代碼如下: public class tagsupport implem
22、ents iterationtag, serializable public tagsupport() public int dostarttag() throws jspexception return skip_body; public int doendtag() throws jspexception return eval_page; public int doafterbody() throws jspexception return skip_body; / 此處省略了tagsupport類中的其他方法和屬性 . . 標簽類通過繼承tagsupport類,就不需要實現(xiàn)tag接口和
23、iteration接口中的每一個方法了,這樣將大大簡化自定義標簽的開發(fā)工作。 4. bodytag接口 bodytag接口繼承了iterationtag接口。bodytag接口不僅擁有iterationtag接口的所有功能,而且還可以初始化和修改標簽體的內(nèi)容。在bodytag接口中定義了兩個方法(doinitbody和setbodycontent)和兩個常量(eval_body_buffered和eval_body_tag),這兩個常量的含義相同。其中eval_body_tag常量是在jsp1.2中的遺留產(chǎn)物,在jsp的后續(xù)版本中可能不支持該常量,因此,建議使用eval_body_buffer
24、e常量。如果dostarttag方法返回eval_body_buffere,web容器就會將標簽體的執(zhí)行結(jié)果保存在bodycontent對象中,然后web容器在處理標簽時會調(diào)用標簽類的setbodycontent方法將bodycontent對象傳入標簽類的對象實例,接下來就可以在標簽類的對象實例中處理標簽體的執(zhí)行結(jié)果了。 由于bodytag接口及其父接口中定義了很多方法,為了在實現(xiàn)bodytag接口的類中不用再實現(xiàn)所有的方法,jsp api提供了一個bodytagsupport類,該類是tagsupport類的子類,并且實現(xiàn)了bodytag接口。在bodytagsupport類中改變了dost
25、arttag方法的默認返回值,并且覆蓋了其他的核心方法,代碼如下: public class bodytagsupport extends tagsupport implements bodytag protected bodycontent bodycontent; public bodytagsupport() super(); public void setbodycontent(bodycontent b) this.bodycontent = b; public bodycontent getbodycontent() return bodycontent; / 改變了dostart
26、tag方法的默認返回值 public int dostarttag() throws jspexception return eval_body_buffered; public int doendtag() throws jspexception return super.doendtag(); public void doinitbody() throws jspexception public int doafterbody() throws jspexception return skip_body; / 此處省略了bodytagsupport類的其他方法和屬性 . . 從前面的內(nèi)容可
27、知,自定義標簽api涉及到了三個方法(dostarttag、doafterbody和doendtag)以及這三個方法可能返回的六個常量(eval_body_include、eval_body_buffere、skip_body、eval_body_again、eval_page和skip_page)。表1.1給出了這三個方法的返回值和這六個常量的關(guān)系。 表1.1 dostarttag、doafterbody和doendtag方法的返回值及其作用 方法名 返回值 dostarttag doafterbody doendtag eval_body_include 執(zhí)行標簽體中的內(nèi)容(直接將標簽體的
28、執(zhí)行結(jié)果輸出到out對象的緩沖區(qū)中) eval_body_buffere 執(zhí)行標簽體中的內(nèi)容,并將標簽體的執(zhí)行結(jié)果保存在bodycontent對象中,以備后續(xù)處理和加工 skip_body 忽略標簽體的內(nèi)容 不再重復(fù)執(zhí)行標簽體的內(nèi)容 * eval_body_again * 重復(fù)執(zhí)行標簽體的內(nèi)容 * eval_page * * 繼續(xù)執(zhí)行自定義標簽后面的內(nèi)容 skip_page * * 忽略自定義標簽后面的內(nèi)容 5. simpletag接口 simpletag是jsp2.0新增的一個接口。該接口只有一個dotag方法,這個方法只在web容器執(zhí)行自定義標簽時調(diào)用一次。所有的處理邏輯(包括是否執(zhí)行標簽
29、體、重復(fù)執(zhí)行標簽體等)都要寫在dotag方法中,因此,simpletag接口的功能相當于bodytag接口,只是simpletag接口要比bodytag接口更容易使用。為了更進一步簡化自定義標簽的開發(fā)工作,jsp api提供了一個實現(xiàn)simpletag接口的simpletagsupport類,建議讀者在編寫簡單標簽時,標簽類從simpletagsupport類繼承。 1.2 實現(xiàn)基本的自定義標簽 一個自定義標簽最基本的功能就是控制是否執(zhí)行標簽體的內(nèi)容,以及控制是否執(zhí)行自定義標簽后面的內(nèi)容。通過實現(xiàn)tag接口的dostarttag方法和doendtag方法可以很容易地完成這兩個功能。在tag接口
30、中還有定義了一些其他的方法(setpagecontext、setparent等),通過實現(xiàn)這些方法,可以編寫更高級的自定義標簽。 1.2.1 tag接口 javax.servlet.jsp.tagext.tag接口是所有傳統(tǒng)標簽的父接口,該接口定義了web容器處理自定義標簽的基本方法。這些方法主要包括web容器執(zhí)行到標簽的開始標記時發(fā)生的標簽開始事件(調(diào)用tag接口的dostarttag方法)和執(zhí)行到標簽的結(jié)束標記時發(fā)生的標簽結(jié)束事件(調(diào)用tag接口的doendtag方法)。在tag接口中定義了四個常量,并由dostarttag方法和doendtag方法返回相應(yīng)的常量以通知web容器如何執(zhí)行自
31、定義標簽。tag接口中定義的常量和方法如下所示: 1. tag接口中定義的常量 在tag接口中定義了如下四個整型常量: eval_body_include skip_body eval_page skip_page 其中eval_body_include和skip_body將作為dostarttag方法的返回值返回給web容器, web容器根據(jù)dostarttag方法的返回值來決定是否執(zhí)行自定義標簽的標簽體。eval_page和skip_page將作為doendtag方法的返回值返回給web容器, web容器根據(jù)doendtag方法的返回值決定是否執(zhí)行的自定義標簽后面的內(nèi)容。 2. setpa
32、gecontext方法 在web容器創(chuàng)建標簽類的對象實例后,會首先調(diào)用標簽類的setpagecontext方法將pagecontext對象實例傳入標簽類的對象實例,然后會調(diào)用標簽類中的其他方法,這樣在標簽類中的其他方法就可以使用pagecontext對象了。setpagecontext方法的定義如下: public void setpagecontext(pagecontext pagecontext) 3. setparent方法和getparent方法 web容器在調(diào)用標簽類的setpagecontext方法后,會調(diào)用標簽類的setparent方法,該方法用來設(shè)置當前標簽的父標簽的對象實例
33、。通過getparent標簽可以獲得當前標簽的父標簽的對象實例。如果當前標簽沒有父標簽,setparent方法的參數(shù)值為null。setparent方法和getparent方法的定義如下: public void setparent(tag t) public tag getparent() 4. dostarttag方法 web容器在依次調(diào)用setpagecontext方法、setparent方法以及設(shè)置當前標簽屬性的setter方法后,就會調(diào)用標簽類的dostarttag方法。當web容器調(diào)用dostarttag方法時,就意味著web容器已經(jīng)開始處理當前標簽的開始標記。如果dostartt
34、ag方法返回eval_body_include,web容器會在執(zhí)行完標簽體后調(diào)用標簽類的doendtag方法;如果doendtag方法返回skip_body,web容器并不會執(zhí)行標簽體,而是直接調(diào)用標簽類的doendtag方法。dostarttag方法的定義如下: int dostarttag() throws jspexception 5. doendtag方法 web容器在遇到標簽的結(jié)束標記時,會調(diào)用標簽類的doendtag方法。如果doendtag方法返回eval_page,web容器會繼續(xù)執(zhí)行結(jié)束標記后面的內(nèi)容;如果doendtag方法返回skip_page,結(jié)束標簽后面的內(nèi)容都不會被
35、執(zhí)行,也就是說,web容器在執(zhí)行當前jsp頁面時,執(zhí)行到標簽的結(jié)束標記處就會終止執(zhí)行當前的jsp頁面。doendtag方法的定義如下: int doendtag() throws jspexception 6. release方法 jsp規(guī)范要求web容器必須在垃圾回收器回收標簽類的對象實例時調(diào)用release方法,以便自定義標簽可以利用該方法釋放所占用的相關(guān)資源。但jsp規(guī)范并沒有規(guī)定web容器調(diào)用release方法的具體時間,因此,release方法的調(diào)用時間由具體的web容器廠商決定。release方法的定義如下: public void release() 1.2.2 標簽類中方法的調(diào)
36、用順序 在本節(jié)給出一個例子來測試標簽類中方法的調(diào)用順序。本示例測試了web容器在調(diào)用自定義標簽時調(diào)用標簽類中的setpagecontext方法、setparent方法、設(shè)置標簽屬性的setter方法、dostarttag方法、doendtag方法和release方法的順序。 【實例1-2】 測試標簽類中方法的調(diào)用順序 1. 編寫invokeordertag類 invokeordertag是一個標簽類,在該類中覆蓋了tagsupport類中的相關(guān)方法,并在這些方法的調(diào)用軌跡輸出到控制臺。invokeordertag類的實現(xiàn)代碼如下: package chapter1; import javax.
37、servlet.jsp.jspexception; import javax.servlet.jsp.pagecontext; import javax.servlet.jsp.tagext.tag; import javax.servlet.jsp.tagext.tagsupport; public class invokeordertag extends tagsupport / 定義了兩個屬性,用于設(shè)置和讀取標簽的相應(yīng)屬性值 private string attr1; private string attr2; / 設(shè)置attr1屬性的值 public void setattr1(str
38、ing attr1) system.out.println(setattr1); this.attr1 = attr1; / 設(shè)置attr2屬性的值 public void setattr2(string attr2) system.out.println(setattr2); this.attr2 = attr2; override public void setpagecontext(pagecontext pagecontext) system.out.println(pagecontext); super.setpagecontext(pagecontext); override pu
39、blic void setparent(tag t) system.out.println(setparent); system.out.print(父標簽:); system.out.println(t); super.setparent(t); public int dostarttag() throws jspexception system.out.println(dostarttag); return super.dostarttag(); public int doendtag() throws jspexception system.out.println(doendtag);
40、return super.doendtag(); override public void release() system.out.println(release); super.release(); 2. 安裝invokeorder標簽 在jsp-taglib.tld文件中添加如下的內(nèi)容來安裝invokeorder標簽: 測試標簽類中方法的調(diào)用順序 invokeorder chapter1.invokeordertag empty attr1 false false attr2 false false 3. 編寫invokeorder.jsp頁面 invokeorder.jsp頁面用來調(diào)用
41、invokeorder標簽。當訪問invokeorder.jsp頁面后,就會在tomcat控制臺輸出相應(yīng)的方法調(diào)用軌跡。invokeorder.jsp頁面的代碼如下: 4. 測試invokeorder標簽 在瀏覽器地址欄中輸入如下的url: http:/localhost:8080/demo/chapter1/invokeorder.jsp tomcat的控制臺將輸出如下的信息: pagecontext setparent 父標簽:org.apache.taglibs.standard.tag.rt.core.iftag8c436b setattr2 setattr1 dostarttag d
42、oendtag 從上面的輸出信息可知,web容器會根據(jù)使用標簽時屬性的位置來調(diào)用設(shè)置屬性值的setter方法(在invokeorder.jsp頁面中調(diào)用invokeorder標簽時,attr2屬性在attr1屬性前面)。 1.2.3 控制是否執(zhí)行標簽體 在本節(jié)的例子通過dostarttag方法的返回值來控制web容器是否執(zhí)行標簽體的內(nèi)容。 【實例1-3】 控制是否執(zhí)行標簽體 1. 實例說明 本示例根據(jù)是否存在body請求參數(shù)來決定dostarttag方法的返回值。如果存在body請求參數(shù),dostarttag方法返回eval_body_include,否則返回skip_body。 2. 編寫d
43、isplaybodytag類 displaybodytag是一個標簽類。該類負責判斷是否存在body請求參數(shù),并根據(jù)判斷結(jié)果決定dostarttag方法的返回值。displaybodytag類的實現(xiàn)代碼如下: package chapter1; import javax.servlet.jsp.jspexception; import javax.servlet.jsp.pagecontext; import javax.servlet.jsp.tagext.tag; import javax.servlet.jsp.tagext.tagsupport; public class displa
44、ybodytag extends tagsupport public int dostarttag() throws jspexception / 獲得body請求參數(shù)的值 string body = pagecontext.getrequest().getparameter(body); / 存在body請求參數(shù),返回eval_body_include if(body != null) return this.eval_body_include; / 不存在body請求參數(shù),返回skip_body else return this.skip_body; 3. 安裝displaybody標簽
45、在jsp-taglib.tld文件中添加如下的內(nèi)容來安裝displaybody標簽: 顯示標簽體的內(nèi)容 displaybody chapter1.displaybodytag jsp 在上面的配置代碼中的元素的值是jsp,該值表示標簽體的內(nèi)容可以是任意jsp頁面元素,jsp也是元素的默認值。 4. 編寫displaybody.jsp頁面 displaybody.jsp頁面用來調(diào)用displaybody標簽,在displaybody的標簽體中有一行字符串,如果訪問displaybody.jsp頁面時包含body請求參數(shù),則displaybody標簽會顯示這行字符串。displaybody.jsp
46、頁面的代碼如下: displaybody標簽體的內(nèi)容: 如果存在請求參數(shù)body,則輸出標簽體的內(nèi)容 5. 測試displaybody標簽 在瀏覽器地址欄中輸入如下的url: http:/localhost:8080/demo/chapter1/displaybody.jsp?body 瀏覽器顯示的信息如圖1.4所示。 圖1.4 訪問displaybody.jsp頁面時帶body請求參數(shù) 如果在訪問displaybody.jsp頁面時不帶body請求參數(shù),則在瀏覽器中輸出的信息如圖1.5所示。 圖1.5 訪問displaybody.jsp頁面時不帶body請求參數(shù) 從圖1.5所示的輸出結(jié)果可以
47、看出,當訪問displaybody.jsp頁面的url不包含body請求時,標簽體中的內(nèi)容并沒有輸出。 1.2.4 控制是否執(zhí)行標簽后面的內(nèi)容 在本節(jié)的例子通過doendtag方法的返回值來控制web容器是否執(zhí)行標簽后面的內(nèi)容。 【實例1-4】 控制是否執(zhí)行標簽后面的內(nèi)容 1. 實例說明 本示例根據(jù)訪問jsp頁面的客戶端ip地址來決定是否執(zhí)行l(wèi)ocalpage標簽后面的內(nèi)容。如果ip地址為,則允許執(zhí)行l(wèi)ocalpage標簽后面的內(nèi)容,否則,web容器只執(zhí)行到localpage標簽的結(jié)束標記為止。 2. 編寫localpagetag標簽 localpagetag是一個標簽類,負責驗證客戶端的ip地址,并根據(jù)驗證結(jié)果決定是否執(zhí)行l(wèi)ocalpage標簽后面的內(nèi)容。localpag
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 新版華東師大版八年級數(shù)學(xué)下冊《16.1.2分式的基本性質(zhì)約分》聽評課記錄4
- 北師大版歷史九年級下冊第13課《新興力量的崛起》聽課評課記錄
- 人教版數(shù)學(xué)七年級上冊2.1《去括號》聽評課記錄
- 人教部編版九年級歷史下冊聽課評課記錄:第13課《羅斯福新政》
- 人教版數(shù)學(xué)九年級上冊24.2《直線和圓的位置關(guān)系(1)》聽評課記錄
- 人教版數(shù)學(xué)八年級上冊《完全平方公式》聽評課記錄6
- 小學(xué)二年級上冊除法口算
- 九年級第一學(xué)期班主任總結(jié)
- 五年級下冊口算題
- 蘇教版四年級數(shù)學(xué)上冊口算練習(xí)題
- 品管圈活動提高氧氣霧化吸入注意事項知曉率
- 格力GMV多聯(lián)機安裝及維修手冊
- 農(nóng)產(chǎn)品質(zhì)量安全控制課件
- 尿失禁健康講座(SUI)
- 南網(wǎng)5S管理、四步法、八步驟
- 幼兒園中班健康:《小河馬的大口罩》 課件
- 管道工程污水管網(wǎng)監(jiān)理規(guī)劃(共44)
- 洪屏抽水蓄能電站達標投產(chǎn)策劃方案
- 危貨運輸車輛日常維護檢查及記錄表
- 公司生產(chǎn)報廢單
- 心身疾病優(yōu)秀課件
評論
0/150
提交評論