jsp程序設(shè)計(jì)入門 沈澤剛、秦玉平 主編的java web 第二版 第06章 JSP標(biāo)簽技術(shù)_第1頁(yè)
jsp程序設(shè)計(jì)入門 沈澤剛、秦玉平 主編的java web 第二版 第06章 JSP標(biāo)簽技術(shù)_第2頁(yè)
jsp程序設(shè)計(jì)入門 沈澤剛、秦玉平 主編的java web 第二版 第06章 JSP標(biāo)簽技術(shù)_第3頁(yè)
jsp程序設(shè)計(jì)入門 沈澤剛、秦玉平 主編的java web 第二版 第06章 JSP標(biāo)簽技術(shù)_第4頁(yè)
jsp程序設(shè)計(jì)入門 沈澤剛、秦玉平 主編的java web 第二版 第06章 JSP標(biāo)簽技術(shù)_第5頁(yè)
已閱讀5頁(yè),還剩122頁(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、第6章JSP標(biāo)簽技術(shù) 此文檔下載自官網(wǎng),除本頁(yè),其余未修改,可直接刪除本頁(yè)本章內(nèi)容 6.1 自定義標(biāo)簽的開發(fā) 6.2 理解TLD文件 6.3 幾種類型標(biāo)簽的開發(fā) 6.4 JSP標(biāo)準(zhǔn)標(biāo)簽庫(kù)本章內(nèi)容 從JSP1.1版開始就可以在JSP頁(yè)面中使用標(biāo)簽了,使用標(biāo)簽不但可以實(shí)現(xiàn)代碼重用,而且可以使JSP代碼更簡(jiǎn)潔。 為了進(jìn)一步簡(jiǎn)化JSP的開發(fā),在JSP 2.0的標(biāo)簽擴(kuò)展API中又增加了SimpleTag接口和其實(shí)現(xiàn)類SimpleTagSupport,使用它們可以開發(fā)簡(jiǎn)單標(biāo)簽。 6.1 自定義標(biāo)簽的開發(fā) 6.1.1 標(biāo)簽擴(kuò)展API 6.1.2 自定義標(biāo)簽的開發(fā)步驟 6.1.3 SimpleTag接口及其生

2、命周期 6.1.4 SimpleTagSupport類6.1 自定義標(biāo)簽的開發(fā) 所謂自定義的標(biāo)簽是用Java語(yǔ)言開發(fā)的程序,當(dāng)其在JSP頁(yè)面中使用時(shí)將執(zhí)行某種動(dòng)作,所以有時(shí)自定義標(biāo)簽又叫作自定義動(dòng)作(custom action)。 在JSP頁(yè)面中可以使用兩類自定義標(biāo)簽。一類是簡(jiǎn)單的(simple)自定義標(biāo)簽,一類是傳統(tǒng)的(classic)自定義標(biāo)簽。傳統(tǒng)的自定義標(biāo)簽是JSP 1.1中提供的,簡(jiǎn)單的自定義標(biāo)簽是JSP 2.0增加的。 6.1.1 標(biāo)簽擴(kuò)展API 要開發(fā)自定義標(biāo)簽,需要使用javax.servlet.jsp.tagext包中的接口和類,這些接口和類稱為標(biāo)簽擴(kuò)展API。圖6-1給出了

3、簡(jiǎn)單標(biāo)簽擴(kuò)展API的層次結(jié)構(gòu)。 JspTag接口是自定義標(biāo)簽根接口,該接口中沒有定義任何方法,它只起到接口標(biāo)識(shí)和類型安全的作用。 SimpleTag接口是JspTag接口的子接口,用來(lái)實(shí)現(xiàn)簡(jiǎn)單的自定義標(biāo)簽。 SimpleTagSupport類是SimpleTag接口的實(shí)現(xiàn)類。6.1.1 標(biāo)簽擴(kuò)展API 除上面的接口和類外,標(biāo)簽處理類還要使用到j(luò)avax.servlet.jsp包中定義的兩個(gè)異常類:JspException和JspTagException類。 6.1.2 自定義標(biāo)簽的開發(fā)步驟 創(chuàng)建自定義標(biāo)簽需要?jiǎng)?chuàng)建下面兩步: 創(chuàng)建標(biāo)簽處理類。 創(chuàng)建標(biāo)簽庫(kù)描述文件TLD。1. 創(chuàng)建標(biāo)簽處理類 標(biāo)簽

4、處理類(tag handler)是實(shí)現(xiàn)某個(gè)標(biāo)簽接口或繼承某個(gè)標(biāo)簽類的實(shí)現(xiàn)類,程序6.1給出了一個(gè)標(biāo)簽處理類,它實(shí)現(xiàn)了SimpleTag接口,該標(biāo)簽的功能是向JSP頁(yè)面輸出一條消息。 程序6.1 HelloTag.java2. 創(chuàng)建標(biāo)簽庫(kù)描述文件 標(biāo)簽庫(kù)描述文件(Tag Library Descriptor,TLD) 用來(lái)定義使用標(biāo)簽的URI和對(duì)標(biāo)簽的描述,它是XML格式的文件,擴(kuò)展名一般為.tld。下面的TLD文件定義了一個(gè)名為hello的標(biāo)簽。 程序6.2 mytaglib.tld TLD文件一般存放在Web應(yīng)用程序的WEB-INF目錄或其子目錄下。3. 在JSP頁(yè)面中使用標(biāo)簽 在JSP頁(yè)面

5、使用自定義標(biāo)簽,需要通過taglib指令聲明自定義標(biāo)簽的前綴和標(biāo)簽庫(kù)的URI,格式如下: prefix屬性值為標(biāo)簽的前綴,uri屬性值為標(biāo)簽庫(kù)的URI。在JSP的taglib指令中,前綴名稱不能使用JSP的保留前綴名,它們包括jsp、jspx、java、javax、servlet、sun、sunw。 程序6.3 helloTag.jsp6.1.3 SimpleTag接口及其生命周期 SimpleTag接口中定義了簡(jiǎn)單標(biāo)簽的生命周期方法。 SimpleTag接口中的方法有兩個(gè)目的。第一,它允許在Java類和JSP之間傳輸信息。第二,它是由Web容器調(diào)用來(lái)初始化SimpleTag操作。該接口共定義

6、了5個(gè)方法: 1SimpleTag接口的方法 public void setJspContext(JspContext pc):該方法由容器調(diào)用,用來(lái)設(shè)置JspContext對(duì)象,使其在標(biāo)簽處理類中可用。 public void setParent(JspTag parent):該方法由容器調(diào)用,用來(lái)設(shè)置父標(biāo)簽對(duì)象。 public void setJspBody(JspFragment jspBody):若標(biāo)簽帶標(biāo)簽體,容器調(diào)用該方法將標(biāo)簽體內(nèi)容存放到JspFragment中。 public JspTag getParent():返回當(dāng)前標(biāo)簽的父標(biāo)簽。 public void doTag()

7、throws JspException, IOException:該方法是簡(jiǎn)單標(biāo)簽的核心方法,由容器調(diào)用完成簡(jiǎn)單標(biāo)簽的操作。2簡(jiǎn)單標(biāo)簽的生命周期 當(dāng)容器在JSP頁(yè)面中遇到自定義標(biāo)簽時(shí),它將加載標(biāo)簽處理類并創(chuàng)建一個(gè)實(shí)例,然后調(diào)用標(biāo)簽類的生命周期方法。標(biāo)簽的生命周期有下面幾個(gè)主要階段:1)調(diào)用setJspContext() 容器為該方法傳遞一個(gè)JspContext類的實(shí)例,該實(shí)例稱為JSP上下文對(duì)象??蓪⒃搶?duì)象保存到一個(gè)實(shí)例變量中以備以后使用。 javax.servlet.jsp.JspContext類定義了允許標(biāo)簽處理類訪問JSP頁(yè)面作用域中屬性的方法,如setAttribute()、getAt

8、tribute()、removeAttribute() 和findAttribute()等。該類還提供了getOut(),它返回JspWriter對(duì)象,用來(lái)向JSP輸出信息。 2簡(jiǎn)單標(biāo)簽的生命周期 2)調(diào)用setParent() 標(biāo)簽可以相互嵌套。在相互嵌套的標(biāo)簽中,外層標(biāo)簽稱為父標(biāo)簽(parent tag),內(nèi)層標(biāo)簽稱為子標(biāo)簽(child tag)。如果標(biāo)簽是嵌套的,容器調(diào)用setParent()設(shè)置標(biāo)簽的父標(biāo)簽對(duì)象。因?yàn)閟etParent()返回一個(gè)JspTag對(duì)象,所以返回的父標(biāo)簽可以是實(shí)現(xiàn)SimpleTag、Tag、IterationTag或BodyTag等接口的對(duì)象。2簡(jiǎn)單標(biāo)簽的生命

9、周期 3)調(diào)用屬性的修改方法 如果自定義標(biāo)簽帶屬性,那么容器在運(yùn)行時(shí)將調(diào)用屬性修改方法設(shè)置屬性值。由于方法格式依賴于屬性名和類型,這些方法在標(biāo)簽處理類中定義。 例如,假設(shè)標(biāo)簽處理類提供了下面屬性: private boolean condition = false; 則應(yīng)該提供下面的屬性修改方法:public void setCondition(boolean condition) this.condition = condition;2簡(jiǎn)單標(biāo)簽的生命周期 4)調(diào)用setJspBody() 如果標(biāo)簽包含標(biāo)簽體內(nèi)容,容器將調(diào)用setJspBody(JspFragment jspBody)方法設(shè)置

10、標(biāo)簽體。它將標(biāo)簽體中的內(nèi)容存放到JspFragment對(duì)象中,以后調(diào)用該對(duì)象的invoke()輸出標(biāo)簽體。在本章的后面將詳細(xì)討論JspFragment類。2簡(jiǎn)單標(biāo)簽的生命周期 5)調(diào)用doTag() 該方法是簡(jiǎn)單標(biāo)簽的核心方法,在doTag()中完成標(biāo)簽的功能。該方法不返回任何值,當(dāng)它返回時(shí),容器返回到前面的處理任務(wù)中。不需要調(diào)用特殊的方法,使用常規(guī)的Java代碼,就可以控制所有迭代和標(biāo)簽體的內(nèi)容。6.1.4 SimpleTagSupport類 SimpleTagSupport類是SimpleTag接口的實(shí)現(xiàn)類,它除實(shí)現(xiàn)了SimpleTag接口中的方法外,還提供了另外三個(gè)方法。 protect

11、ed JspContext getJspContext():返回標(biāo)簽中要處理的JspContext對(duì)象。 protected JspFragment getJspBody():返回JspFragment對(duì)象,它存放了標(biāo)簽體的內(nèi)容。 public static final JspTag findAncestorWithClass(JspTag from, Class klass):根據(jù)給定的實(shí)例和類型查找最接近的實(shí)例。該方法主要用在開發(fā)協(xié)作標(biāo)簽中。6.1.4 SimpleTagSupport類 編寫簡(jiǎn)單標(biāo)簽處理類通常不必實(shí)現(xiàn)SimpleTag接口,而是繼承SimpleTagSupport類,并且

12、僅需覆蓋該類的doTag()。修改HelloTag.java代碼使其繼承SimpleTagSupport可實(shí)現(xiàn)與程序6.1相同的功能。public class HelloTag extends SimpleTagSupport public void doTag() throws JspException, IOException JspWriter out = getJspContext().getOut(); out.print(Hello, A simple tag.); out.print(現(xiàn)在時(shí)間是:+ new java.util.Date(); 6.2 理解TLD文件 6.2.1

13、元素 6.2.2 元素 6.2.3 元素 6.2.4 元素 6.2.5 元素6.2 理解TLD文件 自定義標(biāo)簽需要在TLD文件中聲明。當(dāng)在JSP頁(yè)面中使用自定義標(biāo)簽時(shí),容器將讀取TLD文件,從中獲取有關(guān)自定義標(biāo)簽的信息,如標(biāo)簽名、標(biāo)簽處理類名、是否是空標(biāo)簽以及是否有屬性等。 TLD文件的第一行是聲明,它的根元素是,該元素定義了一些子元素。下面詳細(xì)說(shuō)明這些元素的使用。6.2.1 元素 元素是TLD文件的根元素,該元素帶若干屬性,它們指定標(biāo)簽庫(kù)的命名空間、版本等信息等。下面是元素的DTD定義: 只有和元素是必須的,其他元素都是可選的。 6.2.2 元素 元素指定在JSP頁(yè)面中使用taglib指令時(shí)

14、uri屬性的值。例如,若該元素的定義如下: http:/ 則在JSP頁(yè)面中taglib指令應(yīng)該如下所示: 這里的元素值看上去像一個(gè)Web資源的URI,但實(shí)際上它僅僅是一個(gè)邏輯名稱,并不與任何Web資源對(duì)應(yīng),容器使用它僅完成URI與TLD文件的映射。6.2.2 元素 Web應(yīng)用中可以使用三種類型的URI: 絕對(duì)URI。例如,http:/ 根相對(duì)URI。以“/”開頭且不帶協(xié)議、主機(jī)名或端口號(hào)的URI。它被解釋為相對(duì)于Web應(yīng)用程序文檔根目錄。/mytaglib和/taglib1/helloLib是根相對(duì)URI。 非根相對(duì)URI。不以“/”開頭也不帶協(xié)議、主機(jī)名或端口號(hào)的URI。它被解釋為相對(duì)于當(dāng)前

15、JSP頁(yè)面或相對(duì)于WEB-INF目錄,這要看它在哪使用的。HelloLib 和taglib2/helloLib是非根相對(duì)URI。6.2.2 元素 在TLD文件中也可以不指定元素,這時(shí)容器會(huì)嘗試將taglib指令中的uri屬性看作TLD文件的實(shí)際路徑(以“/”開頭)。例如,對(duì)HelloTag標(biāo)簽,如果沒有在TLD文件中指定元素,在JSP頁(yè)面中可以像下面這樣訪問標(biāo)簽庫(kù):1. 容器如何查找TLD文件 容器是如何找到正確的TLD文件呢?實(shí)際上,在部署一個(gè)Web應(yīng)用時(shí),容器會(huì)自動(dòng)建立一個(gè)URI與TLD之間的映射。 只要把TLD文件放在容器會(huì)查找的位置上,容器就會(huì)找到這個(gè)TLD,并為標(biāo)簽庫(kù)建立一個(gè)映射。

16、容器自動(dòng)查找TLD文件的位置包括: 在/WEB-INF目錄或其子目錄中查找。 在/WEB-INF/lib目錄下的JAR文件中的META-INF目錄或其子目錄中查找。2. 在DD文件中定義URI 在JSP 2.0之前,開發(fā)人員必須在DD文件(web.xml)中為URI指定其TLD文件的具體位置。然后,容器會(huì)查找web.xml文件的元素,建立URI與TLD之間的映射。 例如,對(duì)于上述標(biāo)簽庫(kù),可以將下面代碼加到web.xml文件的元素中。 http:/ /WEB-INF/mytaglib.tld 6.2.3 元素 元素可以包含一個(gè)或多個(gè)元素,每個(gè)元素都提供了關(guān)于標(biāo)簽的信息,如在JSP頁(yè)面中使用的標(biāo)簽

17、名、標(biāo)簽處理類及標(biāo)簽的屬性等。元素的DTD定義如下: 6.2.3 元素 在一個(gè)TLD中不能定義多個(gè)同名的標(biāo)簽,因?yàn)槿萜鞑荒芙馕鰳?biāo)簽處理類。因此,下面代碼是非法的。 hello com.mytag.HelloTag hello com.mytag.WelcomeTag 6.2.3 元素 但是,可以使用一個(gè)標(biāo)簽處理類定義多個(gè)名稱不同的標(biāo)簽。例如: hello com.mytag.HelloTag welcome com.mytag.HelloTag 在JSP頁(yè)面中,假設(shè)使用demo作為前綴,則和兩個(gè)標(biāo)簽都將調(diào)用com.mytag.HelloTag類。6.2.4 元素 如果自定義標(biāo)簽帶屬性,則每個(gè)屬

18、性的信息應(yīng)該在元素中指定。下面是元素的DTD定義: 在元素中,只有元素是必須的且只能出現(xiàn)一次。所有其他元素都是可選的并最多只能出現(xiàn)一次。6.2.5 元素 的子元素指定標(biāo)簽體的內(nèi)容類型,在簡(jiǎn)單標(biāo)簽中它的值是下面三者之一: empty(默認(rèn)值) scriptless tagdependent。 元素值指定為empty,表示標(biāo)簽不帶標(biāo)簽體。下面的例子聲明了標(biāo)簽并指定標(biāo)簽體為空。 hello com.mytag.HelloTag empty1. empty 對(duì)空標(biāo)簽,如果使用時(shí)頁(yè)面作者指定了標(biāo)簽體,容器在轉(zhuǎn)換時(shí)產(chǎn)生錯(cuò)誤。下面對(duì)該標(biāo)簽的使用是不合法的。john 1. empty2. scriptless

19、 元素值指定為scriptless,表示標(biāo)簽體中不能包含JSP腳本元素(JSP聲明、表達(dá)式和小腳本),但可以包含普通模板文本、HTML、EL表達(dá)式、標(biāo)準(zhǔn)動(dòng)作、甚至在該標(biāo)簽中嵌套其他自定義標(biāo)簽。下面的例子聲明了標(biāo)簽,并指定標(biāo)簽體中不能使用腳本。 if com.mytag.IfTag scriptless2. scriptless 因此,下面對(duì)標(biāo)簽的使用是合法的: 2+3 = $2+33. tagdependent 元素值指定為tagdependent,表示容器不會(huì)執(zhí)行標(biāo)簽體,而是在請(qǐng)求時(shí)把它傳遞給標(biāo)簽處理類,由標(biāo)簽處理類根據(jù)需要決定處理標(biāo)簽體。 SELECT * FROM customers3.

20、 tagdependent 對(duì)該標(biāo)簽,元素值必須指定為tagdependent。 query com.mytag.QueryTag tagdependent6.3 幾種類型標(biāo)簽的開發(fā) 6.3.1 空標(biāo)簽的開發(fā) 6.3.2 帶屬性標(biāo)簽的開發(fā) 6.3.3 帶標(biāo)簽體的標(biāo)簽 6.3.4 迭代標(biāo)簽 6.3.5 在標(biāo)簽中使用EL 6.3.6 使用動(dòng)態(tài)屬性 6.3.7 編寫協(xié)作標(biāo)簽6.3.1 空標(biāo)簽的開發(fā) 空標(biāo)簽是不含標(biāo)簽體的標(biāo)簽,它主要向JSP發(fā)送靜態(tài)信息。下面是一個(gè)標(biāo)簽處理類的實(shí)現(xiàn),它是一個(gè)空標(biāo)簽。當(dāng)它在頁(yè)面中使用時(shí)打印一個(gè)紅色的星號(hào)(*)字符。 程序6.4 RedStarTag.java6.3.1 空

21、標(biāo)簽的開發(fā) 下面在下面在TLD文件中通過文件中通過元素描述該標(biāo)元素描述該標(biāo)簽的定義。簽的定義。 star com.mytag.RedStarTag empty6.3.1 空標(biāo)簽的開發(fā) 在在JSP頁(yè)面中訪問空標(biāo)簽有兩種寫法,一頁(yè)面中訪問空標(biāo)簽有兩種寫法,一種是由一對(duì)開始標(biāo)簽和結(jié)束標(biāo)簽組成,中種是由一對(duì)開始標(biāo)簽和結(jié)束標(biāo)簽組成,中間不含任何內(nèi)容,例如:間不含任何內(nèi)容,例如: 另一種寫法是簡(jiǎn)化的格式,即在開始標(biāo)簽另一種寫法是簡(jiǎn)化的格式,即在開始標(biāo)簽?zāi)┪彩褂靡粋€(gè)斜線(末尾使用一個(gè)斜線(/)表示標(biāo)簽結(jié)束,例)表示標(biāo)簽結(jié)束,例如:如: 程序6.5 register.jsp6.3.2 帶屬性標(biāo)簽的開發(fā) 自定義

22、標(biāo)簽可以具有屬性,屬性可以是必選的,也可以是可選的。 對(duì)必選的屬性,如果沒有指定值,容器在JSP頁(yè)面轉(zhuǎn)換時(shí)將給出錯(cuò)誤。 對(duì)可選的屬性,如果沒有指定值,標(biāo)簽處理類將使用默認(rèn)值。默認(rèn)值依賴于標(biāo)簽處理類的實(shí)現(xiàn)。 6.3.2 帶屬性標(biāo)簽的開發(fā) 在JSP頁(yè)面中使用帶屬性的自定義標(biāo)簽的格式如下。prefix:tagName attrib1=fixedValueattrib2=$elVariableattrib3=/ 屬性值可以是常量或EL表達(dá)式,也可以是JSP表達(dá)式。表達(dá)式是在請(qǐng)求時(shí)計(jì)算的,并傳遞給相應(yīng)的標(biāo)簽處理類。6.3.2 帶屬性標(biāo)簽的開發(fā) 當(dāng)標(biāo)簽接受屬性時(shí),對(duì)每個(gè)屬性需要做三件重要的事情。 必須在標(biāo)

23、簽處理類中聲明一個(gè)實(shí)例變量存放屬性的值。 如果屬性不是必須的,則必須要么提供一個(gè)默認(rèn)值,要么在代碼中處理相應(yīng)的null實(shí)例變量。 對(duì)每個(gè)屬性,必須實(shí)現(xiàn)適當(dāng)?shù)男薷姆椒ā?下面開發(fā)一個(gè)名為welcome的標(biāo)簽,它接受一個(gè)名為user的屬性,它在輸出中打印歡迎詞。 程序6.6 WelcomeTag.java6.3.2 帶屬性標(biāo)簽的開發(fā) 下面的元素是在TLD文件中對(duì)該標(biāo)簽的描述。 welcome com.mytag.WelcomeTag scriptless user false true 6.3.2 帶屬性標(biāo)簽的開發(fā) 對(duì)上述定義的標(biāo)簽,若使用demo前綴,則下面的使用是合法的。demo:welcom

24、e user= /6.3.2 帶屬性標(biāo)簽的開發(fā) 屬性值的指定也可以使用JSP的標(biāo)準(zhǔn)動(dòng)作,通過該標(biāo)簽的name屬性指定屬性名,屬性值在標(biāo)簽體中指定。 $param.userName 程序6.7 welcome.jsp6.3.3 帶標(biāo)簽體的標(biāo)簽 在起始標(biāo)簽和結(jié)束標(biāo)簽之間包含的內(nèi)容稱為標(biāo)簽體(body content)。 對(duì)于SimpleTag標(biāo)簽,標(biāo)簽體可以是文本、HTML、EL表達(dá)式等,但不能包含JSP腳本(如聲明、表達(dá)式和小腳本)。 如果需要訪問標(biāo)簽體,應(yīng)該調(diào)用簡(jiǎn)單標(biāo)簽類的getJspBody(),它返回一個(gè)抽象類JspFragment對(duì)象。6.3.3 帶標(biāo)簽體的標(biāo)簽 JspFragment類

25、只定義了兩個(gè)方法。 public JspContext getJspContext():返回與JspFragment有關(guān)的JspContext對(duì)象。 public void invoke(Writer out) :執(zhí)行標(biāo)簽體中的代碼并將結(jié)果發(fā)送到Writer對(duì)象。如果將結(jié)果輸出到JSP頁(yè)面,參數(shù)應(yīng)該為null。 程序6.8 BodyTagDemo.java6.3.3 帶標(biāo)簽體的標(biāo)簽 由于簡(jiǎn)單標(biāo)簽的標(biāo)簽體中不能包含腳本元素,所以在TLD中應(yīng)將的值指定為scriptless或tagdependent,如下所示。 dobody com.mytag.BodyTagDemo scriptless 程序6

26、.9 dobody.jsp6.3.3 帶標(biāo)簽體的標(biāo)簽 如果希望多次執(zhí)行標(biāo)簽體,可以在doTag()中使用循環(huán)結(jié)構(gòu),多次調(diào)用JspFragment的invoke(null)即可。修改SimpleTagExample類的doTag()中的代碼。 for(int i = 0 ; i5 ; i+) getJspBody().invoke(null); 6.3.3 帶標(biāo)簽體的標(biāo)簽 如果需要對(duì)標(biāo)簽體進(jìn)行處理,可以將標(biāo)簽體內(nèi)容保存到StringWriter對(duì)象中,然后將修改后的輸出流對(duì)象發(fā)送到JspWrier對(duì)象。 下面的marker標(biāo)簽從標(biāo)簽體中查找指定的字符串,然后將其使用藍(lán)色大字輸出。 程序6.10

27、MarkerTag.java 6.3.3 帶標(biāo)簽體的標(biāo)簽 在TLD文件中使用下面代碼定義該標(biāo)簽。 marker com.mytag.MarkerTag scriptless search true 下面的JSP頁(yè)面使用了marker標(biāo)簽。 程序6.11 marker.jsp6.3.4 迭代標(biāo)簽 所謂迭代標(biāo)簽就是能夠多次訪問標(biāo)簽體的標(biāo)簽,它實(shí)現(xiàn)了類似于編程語(yǔ)言的循環(huán)的功能。 下面的迭代標(biāo)簽通過一個(gè)名為count的屬性指定對(duì)標(biāo)簽體的迭代次數(shù)。 程序6.12 LoopTag.java6.3.4 迭代標(biāo)簽 下面的元素在TLD文件中描述了該循環(huán)標(biāo)簽。 loop com.mytag.LoopTag scr

28、iptless count true true 6.3.4 迭代標(biāo)簽 下面是使用loop標(biāo)簽的JSP頁(yè)面。 程序6.13 loop.jsp 上述標(biāo)簽有一個(gè)名為count的屬性,它接收一個(gè)整型值,指定標(biāo)簽主體應(yīng)該執(zhí)行的次數(shù)。上述代碼將在輸出中打印三次標(biāo)簽體的內(nèi)容,結(jié)果如圖6-6所示。6.3.5 在標(biāo)簽中使用EL 在標(biāo)簽體中還可以使用EL表達(dá)式,例如: 商品名稱為:$product。 6.3.5 在標(biāo)簽中使用EL 那么在標(biāo)簽處理類中的doTag()應(yīng)該如下。public void doTag() throws JspException,IOException getJspContext().set

29、Attribute(product,蘋果iPhone 5手機(jī)); getJspBody().invoke(null);6.3.5 在標(biāo)簽中使用EL 標(biāo)簽體中的EL表達(dá)式可以是一個(gè)集合(數(shù)組、List或Map)對(duì)象,在標(biāo)簽體中可以訪問它的每個(gè)元素,這只需要在doTag()中使用循環(huán)即可,例如: $product 6.3.5 在標(biāo)簽中使用EL 在標(biāo)簽處理類的doTag()中的代碼如下。public void doTag() throws JspException,IOException String products= 蘋果iPhone 5手機(jī),OLYMPUS數(shù)碼相機(jī), 文曲星電子詞典; for(

30、 int i = 0; iproducts.length; i+) getJspContext().setAttribute(product, productsi); getJspBody().invoke(null); 6.3.5 在標(biāo)簽中使用EL 在自定義標(biāo)簽的屬性值中還可以使用EL表達(dá)式。 下面示例首先在ProductServlet中連接數(shù)據(jù)庫(kù)查詢products表中的指定商品,創(chuàng)建一個(gè)ArrayList對(duì)象并存儲(chǔ)在會(huì)話作用域中,最后將控制重定向到showProduct.jsp頁(yè)面,在JSP頁(yè)面中使用標(biāo)簽顯示商品信息,并為其傳遞productList屬性。 程序6.14 ProductS

31、ervlet.java 程序6.15 ProductTag.java6.3.5 在標(biāo)簽中使用EL 在TLD文件中使用下面代碼定義showProduct標(biāo)簽。 showProduct com.mytag.ProductTag scriptless productList true true 6.3.5 在標(biāo)簽中使用EL 下面的JSP頁(yè)面使用showProduct標(biāo)簽顯示商品信息。 程序6.16 showProduct.jsp6.3.6 使用動(dòng)態(tài)屬性 在簡(jiǎn)單標(biāo)簽中還可以處理動(dòng)態(tài)屬性。所謂動(dòng)態(tài)屬性(dynamic attribute),就是不需要在TLD文件中指定的屬性。 要在簡(jiǎn)單標(biāo)簽中使用動(dòng)態(tài)屬性

32、,標(biāo)簽處理類應(yīng)該實(shí)現(xiàn)DynamicAttributes接口,該接口中只定義了一個(gè)名為setDynamicAttribute()的方法,它用來(lái)處理動(dòng)態(tài)屬性,格式為:6.3.6 使用動(dòng)態(tài)屬性public void setDynamicAttribute( String uri, String localName, Object value) throws JspException 參數(shù)uri表示屬性的命名空間,如果屬于默認(rèn)命名空間,其值為null;參數(shù)localName表示要設(shè)置的動(dòng)態(tài)屬性名;value表示屬性值。當(dāng)標(biāo)簽聲明允許接受動(dòng)態(tài)屬性,而傳遞的屬性又沒有在TLD中聲明時(shí)將調(diào)用該方法。6.3.

33、6 使用動(dòng)態(tài)屬性 下面程序定義了一個(gè)帶動(dòng)態(tài)屬性的標(biāo)簽處理類。在該類中創(chuàng)建了一個(gè)String對(duì)象output,對(duì)每個(gè)動(dòng)態(tài)屬性它將被setDynamicAttribute()更新。一旦結(jié)束讀取屬性,它將調(diào)用doTag(),把該String對(duì)象發(fā)送給JSP顯示。 程序6.17 MathTag.java6.3.6 使用動(dòng)態(tài)屬性 在在TLD件的件的標(biāo)簽中,動(dòng)態(tài)屬性需要使用標(biāo)簽中,動(dòng)態(tài)屬性需要使用元素定義并將其值指定為元素定義并將其值指定為true,如下所示。,如下所示。 mathtag com.mytag.MathTag empty num true true true6.3.6 使用動(dòng)態(tài)屬性 下面代碼

34、給出了如何在下面代碼給出了如何在JSP中使用該標(biāo)簽。中使用該標(biāo)簽。 程序6.18 mathTag.jsp動(dòng)態(tài)屬性的使用 6.3.7 編寫協(xié)作標(biāo)簽 在標(biāo)簽的設(shè)計(jì)和開發(fā)中,通常一組標(biāo)簽協(xié)同工作,這些標(biāo)簽稱為協(xié)作標(biāo)簽(cooperative tags)。 協(xié)作標(biāo)簽的一個(gè)最簡(jiǎn)單的例子是實(shí)現(xiàn)類似于Java編程語(yǔ)言提供的switch-case功能。來(lái)看下面三個(gè)標(biāo)簽:、和,它們可以用在JSP頁(yè)面中,如下所示。 程序6.19 switchTag.jsp6.3.7 編寫協(xié)作標(biāo)簽 程序6.20 SwitchTag.java 程序6.21 CaseTag.java 程序6.22 DefaultTag.java 6.

35、4 JSP標(biāo)準(zhǔn)標(biāo)簽庫(kù) 由于使用自定義標(biāo)簽可能造成程序員對(duì)標(biāo)簽的重復(fù)定義,因此從JSP2.0開始,JSP規(guī)范將標(biāo)準(zhǔn)標(biāo)簽庫(kù)(JSP Standard Tag Library,JSTL)作為標(biāo)準(zhǔn)支持,它可以簡(jiǎn)化JSP頁(yè)面和Web應(yīng)用程序的開發(fā)。 6.4 JSP標(biāo)準(zhǔn)標(biāo)簽庫(kù) 6.4.1 JSTL概述 6.4.2 JSTL核心標(biāo)簽庫(kù) 6.4.3 通用目的標(biāo)簽 6.4.4 條件控制標(biāo)簽 6.4.5 循環(huán)控制標(biāo)簽 6.4.6 URL相關(guān)的標(biāo)簽6.4.1 JSTL概述 在使用JSTL前,首先應(yīng)該獲得JSTL包,并安裝到Tomcat服務(wù)器中。 可以到Jakarta網(wǎng)站下載JSTL包,地址為http:/jakart

36、。JSTL目前的最新版本是1.1.2。下載的是一個(gè)ZIP文件,文件名為jakarta-taglibs-standard-1.1.2.zip。將該文件解壓到一個(gè)目錄中,然后將lib目錄中的兩個(gè)文件jstl.jar和standard.jar復(fù)制到應(yīng)用程序的WEB-INF/lib目錄中,將tld目錄中的文件復(fù)制到WEB-INF/tld目錄中,這樣就完成了JSTL的安裝。6.4.1 JSTL概述 實(shí)際上在Tomcat 服務(wù)器安裝的examples示例應(yīng)用程序的WEB-INFlib目錄中就包含jstl.jar和standard.jar兩個(gè)文件,將它們復(fù)制到你的Web應(yīng)用的WEB-

37、INF/lib目錄中即可。6.4.1 JSTL概述 JSTL共提供了5個(gè)庫(kù),每個(gè)子庫(kù)提供了一組實(shí)現(xiàn)特定功能的標(biāo)簽,具體來(lái)說(shuō),這些子庫(kù)包括: 核心標(biāo)簽庫(kù),包括通用處理的標(biāo)簽。 XML標(biāo)簽庫(kù),包括解析、查詢和轉(zhuǎn)換XML數(shù)據(jù)的標(biāo)簽。 國(guó)際化和格式化庫(kù),包括國(guó)際化和格式化的標(biāo)簽。 SQL標(biāo)簽庫(kù),包括訪問關(guān)系數(shù)據(jù)庫(kù)的標(biāo)簽。 函數(shù)庫(kù),包括管理String和集合的函數(shù)。6.4.2 JSTL核心標(biāo)簽庫(kù) 本節(jié)主要介紹核心(core)標(biāo)簽庫(kù),該庫(kù)的標(biāo)簽可以分成4類,如表6-5所示。 通用目的 6.4.2 JSTL核心標(biāo)簽庫(kù) 條件控制 6.4.2 JSTL核心標(biāo)簽庫(kù) 循環(huán)控制 URL處理 6.4.2 JSTL核心標(biāo)

38、簽庫(kù) 在JSP頁(yè)面中使用JSTL,必須使用taglib指令來(lái)引用標(biāo)簽庫(kù),例如,要使用核心標(biāo)簽庫(kù),必須在JSP頁(yè)面中使用下面的taglib指令。6.4.3 通用目的標(biāo)簽 通用目的的標(biāo)簽包括 1. 標(biāo)簽 標(biāo)簽使用很簡(jiǎn)單,它有兩種語(yǔ)法格式?!靖袷?】不帶標(biāo)簽體的情況 如果escapeXml的值為true(默認(rèn)值),表示將value屬性值中包含的、或&等特殊字符轉(zhuǎn)換為相應(yīng)的實(shí)體引用(或字符編碼),如小于號(hào)()將轉(zhuǎn)換為>。如果escapeXml的值為false將不轉(zhuǎn)換。 1. 標(biāo)簽【格式2】帶標(biāo)簽體的情況 default value 在【格式2】中默認(rèn)值是在標(biāo)簽體中給出的。1. 標(biāo)

39、簽 在value屬性的值中可以使用EL表達(dá)式,例如: 上述代碼分別輸出客戶地址和number變量的值。 從標(biāo)簽的功能可以看到,它可以替換JSP的腳本表達(dá)式。2. 標(biāo)簽 標(biāo)簽設(shè)置作用域變量以及對(duì)象(如JavaBeans與Map)的屬性值。該標(biāo)簽有下面4種語(yǔ)法格式?!靖袷?】不帶標(biāo)簽體的情況2. 標(biāo)簽【格式2】帶標(biāo)簽體的情況c:set var = varName scope = page|request|session|application body content【格式2】是在標(biāo)簽體中指定變量值。 2. 標(biāo)簽 例如,下面兩個(gè)標(biāo)簽: 與 $4*4 都將變量number的值設(shè)置為16,且其作用域?yàn)?/p>

40、會(huì)話作用域。2. 標(biāo)簽 使用標(biāo)簽還可以設(shè)置指定對(duì)象的屬性值,對(duì)象可以是JavaBeans或Map對(duì)象。這可以使用下面兩種格式實(shí)現(xiàn)?!靖袷?】不帶標(biāo)簽體的情況2. 標(biāo)簽 【格式4】帶標(biāo)簽體的情況 body content target屬性指定對(duì)象名,property屬性指定對(duì)象的屬性名(JavaBeans的屬性或Map的鍵)。與設(shè)置變量值一樣,屬性值可以通過value屬性或標(biāo)簽體內(nèi)容指定。2. 標(biāo)簽 下面程序?yàn)橐粋€(gè)名為product的JavaBeans對(duì)象設(shè)置pname屬性值。 程序6.23 setDemo.jsp3. 標(biāo)簽 標(biāo)簽用來(lái)從作用域中刪除變量,它的語(yǔ)法格式為: var屬性指定要?jiǎng)h除的變

41、量名,可選的scope屬性指定作用域。如果沒有指定scope屬性,容器將先在page作用域查找變量,然后是request,接下來(lái)是session,最后是application作用域,找到后將變量清除。4. 標(biāo)簽 標(biāo)簽的功能是捕獲標(biāo)簽體中出現(xiàn)的異常,語(yǔ)法格式為: body content 這里,var是為捕獲到的異常定義的變量名,當(dāng)標(biāo)簽體中代碼發(fā)生異常時(shí),將由該變量引用異常對(duì)象,變量具有page作用域。4. 標(biāo)簽 例如:6.4.4 條件控制標(biāo)簽 條件控制標(biāo)簽有4個(gè): 和標(biāo)簽的功能類似于Java語(yǔ)言的if語(yǔ)句和switch-case語(yǔ)句。1. 標(biāo)簽 標(biāo)簽用來(lái)進(jìn)行條件判斷,它有下面兩種語(yǔ)法格式?!靖?/p>

42、式1】不帶標(biāo)簽體的情況【格式2】帶標(biāo)簽體的情況body content1. 標(biāo)簽 每個(gè)標(biāo)簽必須有一個(gè)名為test的屬性,它是一個(gè)boolean表達(dá)式。對(duì)于【格式1】,只將test的結(jié)果存于變量varName中。對(duì)于【格式2】,若test的結(jié)果為true,則執(zhí)行標(biāo)簽體。 例如,在下面代碼中如果number的值等于16,則會(huì)顯示其值。 $number 2. 標(biāo)簽 標(biāo)簽類似于Java語(yǔ)言的switch-case語(yǔ)句,它本身不帶任何屬性,但包含多個(gè)標(biāo)簽和一個(gè)標(biāo)簽,這些標(biāo)簽?zāi)軌蛲瓿啥喾种ЫY(jié)構(gòu)。例如,下面代碼根據(jù)color變量的值顯示不同的文本。2. 標(biāo)簽 白色! 黑色! 其他顏色! 6.4.5 循環(huán)控制

43、標(biāo)簽 核心標(biāo)簽庫(kù)的和標(biāo)簽允許重復(fù)處理標(biāo)簽體內(nèi)容。使用這些標(biāo)簽,能以三種方式控制循環(huán)的次數(shù)。 對(duì)數(shù)的范圍使用以及它的begin、end和step屬性。 對(duì)Java集合中元素使用以及它的var和items屬性。 對(duì)String對(duì)象中的令牌(token)使用以及它的items屬性。1. 標(biāo)簽 標(biāo)簽主要實(shí)現(xiàn)迭代,它可以對(duì)標(biāo)簽體迭代固定的次數(shù),也可以在集合對(duì)象上迭代,該標(biāo)簽有兩種格式?!靖袷?】迭代固定的次數(shù)body content1. 標(biāo)簽 標(biāo)簽還可以嵌套,如下的table99.jsp頁(yè)面使用了嵌套的標(biāo)簽實(shí)現(xiàn)輸出九九表。 程序6.24 table99.jsp1. 標(biāo)簽 在標(biāo)簽中還可以指定varStat

44、us屬性值來(lái)保存迭代的狀態(tài),例如,如果指定: varStatus=status 則可以通過status訪問迭代的狀態(tài)。其中包括:本次迭代的索引、已經(jīng)迭代的次數(shù)、是否是第一個(gè)迭代、是否是最后一個(gè)迭代等。它們分別用status.index、status.count、status.first、status.last訪問。1. 標(biāo)簽 下面代碼從0計(jì)數(shù)到10,每3個(gè)輸出一個(gè)數(shù)。 程序6.25 foreach_1.jsp1. 標(biāo)簽【格式2】在集合對(duì)象上迭代 body content 這種迭代主要用于對(duì)Java集合對(duì)象的元素迭代,集合對(duì)象如List、Set或Map等。標(biāo)簽對(duì)每個(gè)元素處理一次標(biāo)簽體內(nèi)容。這里,

45、items屬性值指定要迭代的集合對(duì)象,var用來(lái)指定一個(gè)作用域變量名,該變量只在標(biāo)簽內(nèi)部有效。1. 標(biāo)簽 下面例子使用標(biāo)簽顯示List對(duì)象的元素。假設(shè)有一個(gè)Book類定義如下。package com.model;public class Book private String isbn; private String title; private double price;/ 這里省略了屬性的setter方法和getter方法1. 標(biāo)簽 下面的BooksServlet創(chuàng)建一個(gè)List對(duì)象,然后將控制轉(zhuǎn)發(fā)到books.jsp頁(yè)面,在該頁(yè)面中使用標(biāo)簽訪問每本書的信息。 程序6.26 BooksSe

46、rvlet.java 在books.jsp頁(yè)面中使用標(biāo)簽訪問列表中的元素,代碼如下。 程序6.27 books.jsp2. 標(biāo)簽 該標(biāo)簽用來(lái)在字符串中的令牌(token)上迭代,它的語(yǔ)法格式為:body content2. 標(biāo)簽 下面的JSP頁(yè)面tokens.jsp使用標(biāo)簽輸出一個(gè)字符串中各令牌的內(nèi)容。 程序6.28 tokens.jsp6.4.6 URL相關(guān)的標(biāo)簽 與URL相關(guān)的標(biāo)簽有4個(gè): 。1. 標(biāo)簽 標(biāo)簽主要用于在、和標(biāo)簽中指定請(qǐng)求參數(shù),它的格式有下面兩種?!靖袷?】參數(shù)值使用value屬性指定【格式2】參數(shù)值在標(biāo)簽體中指定 param value 2. 標(biāo)簽 標(biāo)簽的功能與標(biāo)準(zhǔn)動(dòng)作的功能類似,可以將一個(gè)靜態(tài)或動(dòng)態(tài)資源包含到當(dāng)前頁(yè)面中。標(biāo)簽有下面兩種語(yǔ)法格式?!靖袷?】資源內(nèi)容作為字符串對(duì)象包含 body content2. 標(biāo)簽【格式2】資

溫馨提示

  • 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論