版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、第6章JSP標簽技術(shù) 此文檔下載自官網(wǎng),除本頁,其余未修改,可直接刪除本頁本章內(nèi)容 6.1 自定義標簽的開發(fā) 6.2 理解TLD文件 6.3 幾種類型標簽的開發(fā) 6.4 JSP標準標簽庫本章內(nèi)容 從JSP1.1版開始就可以在JSP頁面中使用標簽了,使用標簽不但可以實現(xiàn)代碼重用,而且可以使JSP代碼更簡潔。 為了進一步簡化JSP的開發(fā),在JSP 2.0的標簽擴展API中又增加了SimpleTag接口和其實現(xiàn)類SimpleTagSupport,使用它們可以開發(fā)簡單標簽。 6.1 自定義標簽的開發(fā) 6.1.1 標簽擴展API 6.1.2 自定義標簽的開發(fā)步驟 6.1.3 SimpleTag接口及其生
2、命周期 6.1.4 SimpleTagSupport類6.1 自定義標簽的開發(fā) 所謂自定義的標簽是用Java語言開發(fā)的程序,當其在JSP頁面中使用時將執(zhí)行某種動作,所以有時自定義標簽又叫作自定義動作(custom action)。 在JSP頁面中可以使用兩類自定義標簽。一類是簡單的(simple)自定義標簽,一類是傳統(tǒng)的(classic)自定義標簽。傳統(tǒng)的自定義標簽是JSP 1.1中提供的,簡單的自定義標簽是JSP 2.0增加的。 6.1.1 標簽擴展API 要開發(fā)自定義標簽,需要使用javax.servlet.jsp.tagext包中的接口和類,這些接口和類稱為標簽擴展API。圖6-1給出了
3、簡單標簽擴展API的層次結(jié)構(gòu)。 JspTag接口是自定義標簽根接口,該接口中沒有定義任何方法,它只起到接口標識和類型安全的作用。 SimpleTag接口是JspTag接口的子接口,用來實現(xiàn)簡單的自定義標簽。 SimpleTagSupport類是SimpleTag接口的實現(xiàn)類。6.1.1 標簽擴展API 除上面的接口和類外,標簽處理類還要使用到j(luò)avax.servlet.jsp包中定義的兩個異常類:JspException和JspTagException類。 6.1.2 自定義標簽的開發(fā)步驟 創(chuàng)建自定義標簽需要創(chuàng)建下面兩步: 創(chuàng)建標簽處理類。 創(chuàng)建標簽庫描述文件TLD。1. 創(chuàng)建標簽處理類 標簽
4、處理類(tag handler)是實現(xiàn)某個標簽接口或繼承某個標簽類的實現(xiàn)類,程序6.1給出了一個標簽處理類,它實現(xiàn)了SimpleTag接口,該標簽的功能是向JSP頁面輸出一條消息。 程序6.1 HelloTag.java2. 創(chuàng)建標簽庫描述文件 標簽庫描述文件(Tag Library Descriptor,TLD) 用來定義使用標簽的URI和對標簽的描述,它是XML格式的文件,擴展名一般為.tld。下面的TLD文件定義了一個名為hello的標簽。 程序6.2 mytaglib.tld TLD文件一般存放在Web應(yīng)用程序的WEB-INF目錄或其子目錄下。3. 在JSP頁面中使用標簽 在JSP頁面
5、使用自定義標簽,需要通過taglib指令聲明自定義標簽的前綴和標簽庫的URI,格式如下: prefix屬性值為標簽的前綴,uri屬性值為標簽庫的URI。在JSP的taglib指令中,前綴名稱不能使用JSP的保留前綴名,它們包括jsp、jspx、java、javax、servlet、sun、sunw。 程序6.3 helloTag.jsp6.1.3 SimpleTag接口及其生命周期 SimpleTag接口中定義了簡單標簽的生命周期方法。 SimpleTag接口中的方法有兩個目的。第一,它允許在Java類和JSP之間傳輸信息。第二,它是由Web容器調(diào)用來初始化SimpleTag操作。該接口共定義
6、了5個方法: 1SimpleTag接口的方法 public void setJspContext(JspContext pc):該方法由容器調(diào)用,用來設(shè)置JspContext對象,使其在標簽處理類中可用。 public void setParent(JspTag parent):該方法由容器調(diào)用,用來設(shè)置父標簽對象。 public void setJspBody(JspFragment jspBody):若標簽帶標簽體,容器調(diào)用該方法將標簽體內(nèi)容存放到JspFragment中。 public JspTag getParent():返回當前標簽的父標簽。 public void doTag()
7、throws JspException, IOException:該方法是簡單標簽的核心方法,由容器調(diào)用完成簡單標簽的操作。2簡單標簽的生命周期 當容器在JSP頁面中遇到自定義標簽時,它將加載標簽處理類并創(chuàng)建一個實例,然后調(diào)用標簽類的生命周期方法。標簽的生命周期有下面幾個主要階段:1)調(diào)用setJspContext() 容器為該方法傳遞一個JspContext類的實例,該實例稱為JSP上下文對象。可將該對象保存到一個實例變量中以備以后使用。 javax.servlet.jsp.JspContext類定義了允許標簽處理類訪問JSP頁面作用域中屬性的方法,如setAttribute()、getAt
8、tribute()、removeAttribute() 和findAttribute()等。該類還提供了getOut(),它返回JspWriter對象,用來向JSP輸出信息。 2簡單標簽的生命周期 2)調(diào)用setParent() 標簽可以相互嵌套。在相互嵌套的標簽中,外層標簽稱為父標簽(parent tag),內(nèi)層標簽稱為子標簽(child tag)。如果標簽是嵌套的,容器調(diào)用setParent()設(shè)置標簽的父標簽對象。因為setParent()返回一個JspTag對象,所以返回的父標簽可以是實現(xiàn)SimpleTag、Tag、IterationTag或BodyTag等接口的對象。2簡單標簽的生命
9、周期 3)調(diào)用屬性的修改方法 如果自定義標簽帶屬性,那么容器在運行時將調(diào)用屬性修改方法設(shè)置屬性值。由于方法格式依賴于屬性名和類型,這些方法在標簽處理類中定義。 例如,假設(shè)標簽處理類提供了下面屬性: private boolean condition = false; 則應(yīng)該提供下面的屬性修改方法:public void setCondition(boolean condition) this.condition = condition;2簡單標簽的生命周期 4)調(diào)用setJspBody() 如果標簽包含標簽體內(nèi)容,容器將調(diào)用setJspBody(JspFragment jspBody)方法設(shè)置
10、標簽體。它將標簽體中的內(nèi)容存放到JspFragment對象中,以后調(diào)用該對象的invoke()輸出標簽體。在本章的后面將詳細討論JspFragment類。2簡單標簽的生命周期 5)調(diào)用doTag() 該方法是簡單標簽的核心方法,在doTag()中完成標簽的功能。該方法不返回任何值,當它返回時,容器返回到前面的處理任務(wù)中。不需要調(diào)用特殊的方法,使用常規(guī)的Java代碼,就可以控制所有迭代和標簽體的內(nèi)容。6.1.4 SimpleTagSupport類 SimpleTagSupport類是SimpleTag接口的實現(xiàn)類,它除實現(xiàn)了SimpleTag接口中的方法外,還提供了另外三個方法。 protect
11、ed JspContext getJspContext():返回標簽中要處理的JspContext對象。 protected JspFragment getJspBody():返回JspFragment對象,它存放了標簽體的內(nèi)容。 public static final JspTag findAncestorWithClass(JspTag from, Class klass):根據(jù)給定的實例和類型查找最接近的實例。該方法主要用在開發(fā)協(xié)作標簽中。6.1.4 SimpleTagSupport類 編寫簡單標簽處理類通常不必實現(xiàn)SimpleTag接口,而是繼承SimpleTagSupport類,并且
12、僅需覆蓋該類的doTag()。修改HelloTag.java代碼使其繼承SimpleTagSupport可實現(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)在時間是:+ 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文件 自定義標簽需要在TLD文件中聲明。當在JSP頁面中使用自定義標簽時,容器將讀取TLD文件,從中獲取有關(guān)自定義標簽的信息,如標簽名、標簽處理類名、是否是空標簽以及是否有屬性等。 TLD文件的第一行是聲明,它的根元素是,該元素定義了一些子元素。下面詳細說明這些元素的使用。6.2.1 元素 元素是TLD文件的根元素,該元素帶若干屬性,它們指定標簽庫的命名空間、版本等信息等。下面是元素的DTD定義: 只有和元素是必須的,其他元素都是可選的。 6.2.2 元素 元素指定在JSP頁面中使用taglib指令時
14、uri屬性的值。例如,若該元素的定義如下: http:/ 則在JSP頁面中taglib指令應(yīng)該如下所示: 這里的元素值看上去像一個Web資源的URI,但實際上它僅僅是一個邏輯名稱,并不與任何Web資源對應(yīng),容器使用它僅完成URI與TLD文件的映射。6.2.2 元素 Web應(yīng)用中可以使用三種類型的URI: 絕對URI。例如,http:/ 根相對URI。以“/”開頭且不帶協(xié)議、主機名或端口號的URI。它被解釋為相對于Web應(yīng)用程序文檔根目錄。/mytaglib和/taglib1/helloLib是根相對URI。 非根相對URI。不以“/”開頭也不帶協(xié)議、主機名或端口號的URI。它被解釋為相對于當前
15、JSP頁面或相對于WEB-INF目錄,這要看它在哪使用的。HelloLib 和taglib2/helloLib是非根相對URI。6.2.2 元素 在TLD文件中也可以不指定元素,這時容器會嘗試將taglib指令中的uri屬性看作TLD文件的實際路徑(以“/”開頭)。例如,對HelloTag標簽,如果沒有在TLD文件中指定元素,在JSP頁面中可以像下面這樣訪問標簽庫:1. 容器如何查找TLD文件 容器是如何找到正確的TLD文件呢?實際上,在部署一個Web應(yīng)用時,容器會自動建立一個URI與TLD之間的映射。 只要把TLD文件放在容器會查找的位置上,容器就會找到這個TLD,并為標簽庫建立一個映射。
16、容器自動查找TLD文件的位置包括: 在/WEB-INF目錄或其子目錄中查找。 在/WEB-INF/lib目錄下的JAR文件中的META-INF目錄或其子目錄中查找。2. 在DD文件中定義URI 在JSP 2.0之前,開發(fā)人員必須在DD文件(web.xml)中為URI指定其TLD文件的具體位置。然后,容器會查找web.xml文件的元素,建立URI與TLD之間的映射。 例如,對于上述標簽庫,可以將下面代碼加到web.xml文件的元素中。 http:/ /WEB-INF/mytaglib.tld 6.2.3 元素 元素可以包含一個或多個元素,每個元素都提供了關(guān)于標簽的信息,如在JSP頁面中使用的標簽
17、名、標簽處理類及標簽的屬性等。元素的DTD定義如下: 6.2.3 元素 在一個TLD中不能定義多個同名的標簽,因為容器不能解析標簽處理類。因此,下面代碼是非法的。 hello com.mytag.HelloTag hello com.mytag.WelcomeTag 6.2.3 元素 但是,可以使用一個標簽處理類定義多個名稱不同的標簽。例如: hello com.mytag.HelloTag welcome com.mytag.HelloTag 在JSP頁面中,假設(shè)使用demo作為前綴,則和兩個標簽都將調(diào)用com.mytag.HelloTag類。6.2.4 元素 如果自定義標簽帶屬性,則每個屬
18、性的信息應(yīng)該在元素中指定。下面是元素的DTD定義: 在元素中,只有元素是必須的且只能出現(xiàn)一次。所有其他元素都是可選的并最多只能出現(xiàn)一次。6.2.5 元素 的子元素指定標簽體的內(nèi)容類型,在簡單標簽中它的值是下面三者之一: empty(默認值) scriptless tagdependent。 元素值指定為empty,表示標簽不帶標簽體。下面的例子聲明了標簽并指定標簽體為空。 hello com.mytag.HelloTag empty1. empty 對空標簽,如果使用時頁面作者指定了標簽體,容器在轉(zhuǎn)換時產(chǎn)生錯誤。下面對該標簽的使用是不合法的。john 1. empty2. scriptless
19、 元素值指定為scriptless,表示標簽體中不能包含JSP腳本元素(JSP聲明、表達式和小腳本),但可以包含普通模板文本、HTML、EL表達式、標準動作、甚至在該標簽中嵌套其他自定義標簽。下面的例子聲明了標簽,并指定標簽體中不能使用腳本。 if com.mytag.IfTag scriptless2. scriptless 因此,下面對標簽的使用是合法的: 2+3 = $2+33. tagdependent 元素值指定為tagdependent,表示容器不會執(zhí)行標簽體,而是在請求時把它傳遞給標簽處理類,由標簽處理類根據(jù)需要決定處理標簽體。 SELECT * FROM customers3.
20、 tagdependent 對該標簽,元素值必須指定為tagdependent。 query com.mytag.QueryTag tagdependent6.3 幾種類型標簽的開發(fā) 6.3.1 空標簽的開發(fā) 6.3.2 帶屬性標簽的開發(fā) 6.3.3 帶標簽體的標簽 6.3.4 迭代標簽 6.3.5 在標簽中使用EL 6.3.6 使用動態(tài)屬性 6.3.7 編寫協(xié)作標簽6.3.1 空標簽的開發(fā) 空標簽是不含標簽體的標簽,它主要向JSP發(fā)送靜態(tài)信息。下面是一個標簽處理類的實現(xiàn),它是一個空標簽。當它在頁面中使用時打印一個紅色的星號(*)字符。 程序6.4 RedStarTag.java6.3.1 空
21、標簽的開發(fā) 下面在下面在TLD文件中通過文件中通過元素描述該標元素描述該標簽的定義。簽的定義。 star com.mytag.RedStarTag empty6.3.1 空標簽的開發(fā) 在在JSP頁面中訪問空標簽有兩種寫法,一頁面中訪問空標簽有兩種寫法,一種是由一對開始標簽和結(jié)束標簽組成,中種是由一對開始標簽和結(jié)束標簽組成,中間不含任何內(nèi)容,例如:間不含任何內(nèi)容,例如: 另一種寫法是簡化的格式,即在開始標簽另一種寫法是簡化的格式,即在開始標簽?zāi)┪彩褂靡粋€斜線(末尾使用一個斜線(/)表示標簽結(jié)束,例)表示標簽結(jié)束,例如:如: 程序6.5 register.jsp6.3.2 帶屬性標簽的開發(fā) 自定義
22、標簽可以具有屬性,屬性可以是必選的,也可以是可選的。 對必選的屬性,如果沒有指定值,容器在JSP頁面轉(zhuǎn)換時將給出錯誤。 對可選的屬性,如果沒有指定值,標簽處理類將使用默認值。默認值依賴于標簽處理類的實現(xiàn)。 6.3.2 帶屬性標簽的開發(fā) 在JSP頁面中使用帶屬性的自定義標簽的格式如下。prefix:tagName attrib1=fixedValueattrib2=$elVariableattrib3=/ 屬性值可以是常量或EL表達式,也可以是JSP表達式。表達式是在請求時計算的,并傳遞給相應(yīng)的標簽處理類。6.3.2 帶屬性標簽的開發(fā) 當標簽接受屬性時,對每個屬性需要做三件重要的事情。 必須在標
23、簽處理類中聲明一個實例變量存放屬性的值。 如果屬性不是必須的,則必須要么提供一個默認值,要么在代碼中處理相應(yīng)的null實例變量。 對每個屬性,必須實現(xiàn)適當?shù)男薷姆椒ā?下面開發(fā)一個名為welcome的標簽,它接受一個名為user的屬性,它在輸出中打印歡迎詞。 程序6.6 WelcomeTag.java6.3.2 帶屬性標簽的開發(fā) 下面的元素是在TLD文件中對該標簽的描述。 welcome com.mytag.WelcomeTag scriptless user false true 6.3.2 帶屬性標簽的開發(fā) 對上述定義的標簽,若使用demo前綴,則下面的使用是合法的。demo:welcom
24、e user= /6.3.2 帶屬性標簽的開發(fā) 屬性值的指定也可以使用JSP的標準動作,通過該標簽的name屬性指定屬性名,屬性值在標簽體中指定。 $param.userName 程序6.7 welcome.jsp6.3.3 帶標簽體的標簽 在起始標簽和結(jié)束標簽之間包含的內(nèi)容稱為標簽體(body content)。 對于SimpleTag標簽,標簽體可以是文本、HTML、EL表達式等,但不能包含JSP腳本(如聲明、表達式和小腳本)。 如果需要訪問標簽體,應(yīng)該調(diào)用簡單標簽類的getJspBody(),它返回一個抽象類JspFragment對象。6.3.3 帶標簽體的標簽 JspFragment類
25、只定義了兩個方法。 public JspContext getJspContext():返回與JspFragment有關(guān)的JspContext對象。 public void invoke(Writer out) :執(zhí)行標簽體中的代碼并將結(jié)果發(fā)送到Writer對象。如果將結(jié)果輸出到JSP頁面,參數(shù)應(yīng)該為null。 程序6.8 BodyTagDemo.java6.3.3 帶標簽體的標簽 由于簡單標簽的標簽體中不能包含腳本元素,所以在TLD中應(yīng)將的值指定為scriptless或tagdependent,如下所示。 dobody com.mytag.BodyTagDemo scriptless 程序6
26、.9 dobody.jsp6.3.3 帶標簽體的標簽 如果希望多次執(zhí)行標簽體,可以在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 帶標簽體的標簽 如果需要對標簽體進行處理,可以將標簽體內(nèi)容保存到StringWriter對象中,然后將修改后的輸出流對象發(fā)送到JspWrier對象。 下面的marker標簽從標簽體中查找指定的字符串,然后將其使用藍色大字輸出。 程序6.10
27、MarkerTag.java 6.3.3 帶標簽體的標簽 在TLD文件中使用下面代碼定義該標簽。 marker com.mytag.MarkerTag scriptless search true 下面的JSP頁面使用了marker標簽。 程序6.11 marker.jsp6.3.4 迭代標簽 所謂迭代標簽就是能夠多次訪問標簽體的標簽,它實現(xiàn)了類似于編程語言的循環(huán)的功能。 下面的迭代標簽通過一個名為count的屬性指定對標簽體的迭代次數(shù)。 程序6.12 LoopTag.java6.3.4 迭代標簽 下面的元素在TLD文件中描述了該循環(huán)標簽。 loop com.mytag.LoopTag scr
28、iptless count true true 6.3.4 迭代標簽 下面是使用loop標簽的JSP頁面。 程序6.13 loop.jsp 上述標簽有一個名為count的屬性,它接收一個整型值,指定標簽主體應(yīng)該執(zhí)行的次數(shù)。上述代碼將在輸出中打印三次標簽體的內(nèi)容,結(jié)果如圖6-6所示。6.3.5 在標簽中使用EL 在標簽體中還可以使用EL表達式,例如: 商品名稱為:$product。 6.3.5 在標簽中使用EL 那么在標簽處理類中的doTag()應(yīng)該如下。public void doTag() throws JspException,IOException getJspContext().set
29、Attribute(product,蘋果iPhone 5手機); getJspBody().invoke(null);6.3.5 在標簽中使用EL 標簽體中的EL表達式可以是一個集合(數(shù)組、List或Map)對象,在標簽體中可以訪問它的每個元素,這只需要在doTag()中使用循環(huán)即可,例如: $product 6.3.5 在標簽中使用EL 在標簽處理類的doTag()中的代碼如下。public void doTag() throws JspException,IOException String products= 蘋果iPhone 5手機,OLYMPUS數(shù)碼相機, 文曲星電子詞典; for(
30、 int i = 0; iproducts.length; i+) getJspContext().setAttribute(product, productsi); getJspBody().invoke(null); 6.3.5 在標簽中使用EL 在自定義標簽的屬性值中還可以使用EL表達式。 下面示例首先在ProductServlet中連接數(shù)據(jù)庫查詢products表中的指定商品,創(chuàng)建一個ArrayList對象并存儲在會話作用域中,最后將控制重定向到showProduct.jsp頁面,在JSP頁面中使用標簽顯示商品信息,并為其傳遞productList屬性。 程序6.14 ProductS
31、ervlet.java 程序6.15 ProductTag.java6.3.5 在標簽中使用EL 在TLD文件中使用下面代碼定義showProduct標簽。 showProduct com.mytag.ProductTag scriptless productList true true 6.3.5 在標簽中使用EL 下面的JSP頁面使用showProduct標簽顯示商品信息。 程序6.16 showProduct.jsp6.3.6 使用動態(tài)屬性 在簡單標簽中還可以處理動態(tài)屬性。所謂動態(tài)屬性(dynamic attribute),就是不需要在TLD文件中指定的屬性。 要在簡單標簽中使用動態(tài)屬性
32、,標簽處理類應(yīng)該實現(xiàn)DynamicAttributes接口,該接口中只定義了一個名為setDynamicAttribute()的方法,它用來處理動態(tài)屬性,格式為:6.3.6 使用動態(tài)屬性public void setDynamicAttribute( String uri, String localName, Object value) throws JspException 參數(shù)uri表示屬性的命名空間,如果屬于默認命名空間,其值為null;參數(shù)localName表示要設(shè)置的動態(tài)屬性名;value表示屬性值。當標簽聲明允許接受動態(tài)屬性,而傳遞的屬性又沒有在TLD中聲明時將調(diào)用該方法。6.3.
33、6 使用動態(tài)屬性 下面程序定義了一個帶動態(tài)屬性的標簽處理類。在該類中創(chuàng)建了一個String對象output,對每個動態(tài)屬性它將被setDynamicAttribute()更新。一旦結(jié)束讀取屬性,它將調(diào)用doTag(),把該String對象發(fā)送給JSP顯示。 程序6.17 MathTag.java6.3.6 使用動態(tài)屬性 在在TLD件的件的標簽中,動態(tài)屬性需要使用標簽中,動態(tài)屬性需要使用元素定義并將其值指定為元素定義并將其值指定為true,如下所示。,如下所示。 mathtag com.mytag.MathTag empty num true true true6.3.6 使用動態(tài)屬性 下面代碼
34、給出了如何在下面代碼給出了如何在JSP中使用該標簽。中使用該標簽。 程序6.18 mathTag.jsp動態(tài)屬性的使用 6.3.7 編寫協(xié)作標簽 在標簽的設(shè)計和開發(fā)中,通常一組標簽協(xié)同工作,這些標簽稱為協(xié)作標簽(cooperative tags)。 協(xié)作標簽的一個最簡單的例子是實現(xiàn)類似于Java編程語言提供的switch-case功能。來看下面三個標簽:、和,它們可以用在JSP頁面中,如下所示。 程序6.19 switchTag.jsp6.3.7 編寫協(xié)作標簽 程序6.20 SwitchTag.java 程序6.21 CaseTag.java 程序6.22 DefaultTag.java 6.
35、4 JSP標準標簽庫 由于使用自定義標簽可能造成程序員對標簽的重復(fù)定義,因此從JSP2.0開始,JSP規(guī)范將標準標簽庫(JSP Standard Tag Library,JSTL)作為標準支持,它可以簡化JSP頁面和Web應(yīng)用程序的開發(fā)。 6.4 JSP標準標簽庫 6.4.1 JSTL概述 6.4.2 JSTL核心標簽庫 6.4.3 通用目的標簽 6.4.4 條件控制標簽 6.4.5 循環(huán)控制標簽 6.4.6 URL相關(guān)的標簽6.4.1 JSTL概述 在使用JSTL前,首先應(yīng)該獲得JSTL包,并安裝到Tomcat服務(wù)器中。 可以到Jakarta網(wǎng)站下載JSTL包,地址為http:/jakart
36、。JSTL目前的最新版本是1.1.2。下載的是一個ZIP文件,文件名為jakarta-taglibs-standard-1.1.2.zip。將該文件解壓到一個目錄中,然后將lib目錄中的兩個文件jstl.jar和standard.jar復(fù)制到應(yīng)用程序的WEB-INF/lib目錄中,將tld目錄中的文件復(fù)制到WEB-INF/tld目錄中,這樣就完成了JSTL的安裝。6.4.1 JSTL概述 實際上在Tomcat 服務(wù)器安裝的examples示例應(yīng)用程序的WEB-INFlib目錄中就包含jstl.jar和standard.jar兩個文件,將它們復(fù)制到你的Web應(yīng)用的WEB-
37、INF/lib目錄中即可。6.4.1 JSTL概述 JSTL共提供了5個庫,每個子庫提供了一組實現(xiàn)特定功能的標簽,具體來說,這些子庫包括: 核心標簽庫,包括通用處理的標簽。 XML標簽庫,包括解析、查詢和轉(zhuǎn)換XML數(shù)據(jù)的標簽。 國際化和格式化庫,包括國際化和格式化的標簽。 SQL標簽庫,包括訪問關(guān)系數(shù)據(jù)庫的標簽。 函數(shù)庫,包括管理String和集合的函數(shù)。6.4.2 JSTL核心標簽庫 本節(jié)主要介紹核心(core)標簽庫,該庫的標簽可以分成4類,如表6-5所示。 通用目的 6.4.2 JSTL核心標簽庫 條件控制 6.4.2 JSTL核心標簽庫 循環(huán)控制 URL處理 6.4.2 JSTL核心標
38、簽庫 在JSP頁面中使用JSTL,必須使用taglib指令來引用標簽庫,例如,要使用核心標簽庫,必須在JSP頁面中使用下面的taglib指令。6.4.3 通用目的標簽 通用目的的標簽包括 1. 標簽 標簽使用很簡單,它有兩種語法格式?!靖袷?】不帶標簽體的情況 如果escapeXml的值為true(默認值),表示將value屬性值中包含的、或&等特殊字符轉(zhuǎn)換為相應(yīng)的實體引用(或字符編碼),如小于號()將轉(zhuǎn)換為>。如果escapeXml的值為false將不轉(zhuǎn)換。 1. 標簽【格式2】帶標簽體的情況 default value 在【格式2】中默認值是在標簽體中給出的。1. 標
39、簽 在value屬性的值中可以使用EL表達式,例如: 上述代碼分別輸出客戶地址和number變量的值。 從標簽的功能可以看到,它可以替換JSP的腳本表達式。2. 標簽 標簽設(shè)置作用域變量以及對象(如JavaBeans與Map)的屬性值。該標簽有下面4種語法格式。【格式1】不帶標簽體的情況2. 標簽【格式2】帶標簽體的情況c:set var = varName scope = page|request|session|application body content【格式2】是在標簽體中指定變量值。 2. 標簽 例如,下面兩個標簽: 與 $4*4 都將變量number的值設(shè)置為16,且其作用域為
40、會話作用域。2. 標簽 使用標簽還可以設(shè)置指定對象的屬性值,對象可以是JavaBeans或Map對象。這可以使用下面兩種格式實現(xiàn)?!靖袷?】不帶標簽體的情況2. 標簽 【格式4】帶標簽體的情況 body content target屬性指定對象名,property屬性指定對象的屬性名(JavaBeans的屬性或Map的鍵)。與設(shè)置變量值一樣,屬性值可以通過value屬性或標簽體內(nèi)容指定。2. 標簽 下面程序為一個名為product的JavaBeans對象設(shè)置pname屬性值。 程序6.23 setDemo.jsp3. 標簽 標簽用來從作用域中刪除變量,它的語法格式為: var屬性指定要刪除的變
41、量名,可選的scope屬性指定作用域。如果沒有指定scope屬性,容器將先在page作用域查找變量,然后是request,接下來是session,最后是application作用域,找到后將變量清除。4. 標簽 標簽的功能是捕獲標簽體中出現(xiàn)的異常,語法格式為: body content 這里,var是為捕獲到的異常定義的變量名,當標簽體中代碼發(fā)生異常時,將由該變量引用異常對象,變量具有page作用域。4. 標簽 例如:6.4.4 條件控制標簽 條件控制標簽有4個: 和標簽的功能類似于Java語言的if語句和switch-case語句。1. 標簽 標簽用來進行條件判斷,它有下面兩種語法格式。【格
42、式1】不帶標簽體的情況【格式2】帶標簽體的情況body content1. 標簽 每個標簽必須有一個名為test的屬性,它是一個boolean表達式。對于【格式1】,只將test的結(jié)果存于變量varName中。對于【格式2】,若test的結(jié)果為true,則執(zhí)行標簽體。 例如,在下面代碼中如果number的值等于16,則會顯示其值。 $number 2. 標簽 標簽類似于Java語言的switch-case語句,它本身不帶任何屬性,但包含多個標簽和一個標簽,這些標簽?zāi)軌蛲瓿啥喾种ЫY(jié)構(gòu)。例如,下面代碼根據(jù)color變量的值顯示不同的文本。2. 標簽 白色! 黑色! 其他顏色! 6.4.5 循環(huán)控制
43、標簽 核心標簽庫的和標簽允許重復(fù)處理標簽體內(nèi)容。使用這些標簽,能以三種方式控制循環(huán)的次數(shù)。 對數(shù)的范圍使用以及它的begin、end和step屬性。 對Java集合中元素使用以及它的var和items屬性。 對String對象中的令牌(token)使用以及它的items屬性。1. 標簽 標簽主要實現(xiàn)迭代,它可以對標簽體迭代固定的次數(shù),也可以在集合對象上迭代,該標簽有兩種格式。【格式1】迭代固定的次數(shù)body content1. 標簽 標簽還可以嵌套,如下的table99.jsp頁面使用了嵌套的標簽實現(xiàn)輸出九九表。 程序6.24 table99.jsp1. 標簽 在標簽中還可以指定varStat
44、us屬性值來保存迭代的狀態(tài),例如,如果指定: varStatus=status 則可以通過status訪問迭代的狀態(tài)。其中包括:本次迭代的索引、已經(jīng)迭代的次數(shù)、是否是第一個迭代、是否是最后一個迭代等。它們分別用status.index、status.count、status.first、status.last訪問。1. 標簽 下面代碼從0計數(shù)到10,每3個輸出一個數(shù)。 程序6.25 foreach_1.jsp1. 標簽【格式2】在集合對象上迭代 body content 這種迭代主要用于對Java集合對象的元素迭代,集合對象如List、Set或Map等。標簽對每個元素處理一次標簽體內(nèi)容。這里,
45、items屬性值指定要迭代的集合對象,var用來指定一個作用域變量名,該變量只在標簽內(nèi)部有效。1. 標簽 下面例子使用標簽顯示List對象的元素。假設(shè)有一個Book類定義如下。package com.model;public class Book private String isbn; private String title; private double price;/ 這里省略了屬性的setter方法和getter方法1. 標簽 下面的BooksServlet創(chuàng)建一個List對象,然后將控制轉(zhuǎn)發(fā)到books.jsp頁面,在該頁面中使用標簽訪問每本書的信息。 程序6.26 BooksSe
46、rvlet.java 在books.jsp頁面中使用標簽訪問列表中的元素,代碼如下。 程序6.27 books.jsp2. 標簽 該標簽用來在字符串中的令牌(token)上迭代,它的語法格式為:body content2. 標簽 下面的JSP頁面tokens.jsp使用標簽輸出一個字符串中各令牌的內(nèi)容。 程序6.28 tokens.jsp6.4.6 URL相關(guān)的標簽 與URL相關(guān)的標簽有4個: 。1. 標簽 標簽主要用于在、和標簽中指定請求參數(shù),它的格式有下面兩種。【格式1】參數(shù)值使用value屬性指定【格式2】參數(shù)值在標簽體中指定 param value 2. 標簽 標簽的功能與標準動作的功能類似,可以將一個靜態(tài)或動態(tài)資源包含到當前頁面中。標簽有下面兩種語法格式?!靖袷?】資源內(nèi)容作為字符串對象包含 body content2. 標簽【格式2】資
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024藕塘承包與農(nóng)業(yè)產(chǎn)業(yè)化發(fā)展合作合同范本3篇
- 2024房租租賃合同補充協(xié)議
- 2019年7月國家開放大學(xué)??啤陡叩葦?shù)學(xué)基礎(chǔ)》期末紙質(zhì)考試試題及答案
- 焦慮癥健康宣教
- 2024年解除婚姻關(guān)系后贍養(yǎng)費協(xié)議
- 2024水電安裝勞務(wù)分包合同協(xié)議書-農(nóng)村飲水安全工程專用3篇
- 2024某電子商務(wù)公司與社交媒體平臺廣告投放合同
- 福建省南平市太平鎮(zhèn)中學(xué)高三數(shù)學(xué)理期末試卷含解析
- 2024洗滌服務(wù)綠色環(huán)保材料采購合同書3篇
- 2024年酒店食堂蔬菜品質(zhì)提升采購協(xié)議2篇
- 物理-海南省天一大聯(lián)考2023-2024學(xué)年高三學(xué)業(yè)水平診斷(二)帶答案
- 【閱讀提升】部編版語文五年級下冊第二單元閱讀要素解析 類文閱讀課外閱讀過關(guān)(含答案)
- 2023年海南省公務(wù)員錄用考試《行測》真題和答案解析
- 病理科醫(yī)院感染控制
- 冰晶石生產(chǎn)工藝
- 倉庫風險應(yīng)急處置預(yù)案
- 銷售人員工作匯報模板
- 購銷合同電子版完整版
- 城鎮(zhèn)公廁保潔管理
- 福建省福州市延安中學(xué)2023-2024學(xué)年八年級上學(xué)期期末物理模擬試卷+
- 分布式光伏電站安全運維
評論
0/150
提交評論