JSP自定義標簽_第1頁
JSP自定義標簽_第2頁
JSP自定義標簽_第3頁
JSP自定義標簽_第4頁
JSP自定義標簽_第5頁
已閱讀5頁,還剩31頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、主題:主題: JSP是一種是一種Web開發(fā)語言,是一種基于開發(fā)語言,是一種基于Java的技的技 術(shù)。術(shù)。JSP頁面與傳統(tǒng)的頁面與傳統(tǒng)的HTML語言有些類似,也由一語言有些類似,也由一 些標簽組成。所不同的是,它是一種在服務(wù)端動態(tài)些標簽組成。所不同的是,它是一種在服務(wù)端動態(tài) 生成生成Web頁面的技術(shù),而不僅僅是像頁面的技術(shù),而不僅僅是像HTML語言的語言的 靜態(tài)顯示。靜態(tài)顯示。 JSP頁面可以將內(nèi)容與顯示分離。它可以通過類頁面可以將內(nèi)容與顯示分離。它可以通過類 似似HTML頁面的標簽來將頁面作統(tǒng)籌規(guī)劃,然后再頁面的標簽來將頁面作統(tǒng)籌規(guī)劃,然后再 將動態(tài)生成的內(nèi)容嵌入到各個標簽當中去。通過服將動態(tài)

2、生成的內(nèi)容嵌入到各個標簽當中去。通過服 務(wù)端的務(wù)端的JSP引擎,生成新的內(nèi)容并以引擎,生成新的內(nèi)容并以HTML格式發(fā)送格式發(fā)送 到客戶端瀏覽器中。到客戶端瀏覽器中。 隨著隨著Web應(yīng)用開發(fā)技術(shù)的不斷發(fā)展,及業(yè)務(wù)展應(yīng)用開發(fā)技術(shù)的不斷發(fā)展,及業(yè)務(wù)展 顯的愈加復(fù)雜,傳統(tǒng)的顯的愈加復(fù)雜,傳統(tǒng)的JSP頁面在開發(fā)進度和效率頁面在開發(fā)進度和效率 上已經(jīng)不再能滿足需求。如何將業(yè)務(wù)邏輯代碼與上已經(jīng)不再能滿足需求。如何將業(yè)務(wù)邏輯代碼與 展現(xiàn)代碼分離,使代碼更易于維護和修改,成了展現(xiàn)代碼分離,使代碼更易于維護和修改,成了 JSP Web開發(fā)領(lǐng)域的一個瓶頸。開發(fā)領(lǐng)域的一個瓶頸。 JavaBean組件技術(shù)將業(yè)務(wù)邏輯進行

3、了封裝,提組件技術(shù)將業(yè)務(wù)邏輯進行了封裝,提 高了可復(fù)用性,降低了維護高了可復(fù)用性,降低了維護JSP成本。那么在頁面成本。那么在頁面 展現(xiàn)方面,展現(xiàn)方面,JSP是否也提供了一種機制,使得展現(xiàn)是否也提供了一種機制,使得展現(xiàn) 代碼封裝后,可以進行復(fù)用?代碼封裝后,可以進行復(fù)用? JSP標簽庫是生成腳本的一種機制。標簽庫是生成腳本的一種機制。 標簽是規(guī)劃頁面的工具。在編寫頁面時,經(jīng)標簽是規(guī)劃頁面的工具。在編寫頁面時,經(jīng) 常會碰到一些基本的頁面標簽。如編輯表格標常會碰到一些基本的頁面標簽。如編輯表格標 簽簽“”,頁面控件標,頁面控件標 簽簽”“及在及在JSP開開 發(fā)中已經(jīng)占有了很大比重的發(fā)中已經(jīng)占有了很

4、大比重的JavaBean標簽標簽 “”等,這些都是頁面默認配等,這些都是頁面默認配 置的標簽。置的標簽。 自定義標簽就是我們根據(jù)自己要求來制定、組合一些已存自定義標簽就是我們根據(jù)自己要求來制定、組合一些已存 在的腳本代碼,形成一個新的腳本代碼。在的腳本代碼,形成一個新的腳本代碼。 自定義標簽其實是一個自定義標簽其實是一個Java類,他封裝了一些標簽代碼,類,他封裝了一些標簽代碼, 形成一個具有某個功能的新標簽。形成一個具有某個功能的新標簽。 封裝為一個封裝為一個Java類的好處:類的好處: 1.增加了可擴展性。我們可以在不同標簽之間可以建立增加了可擴展性。我們可以在不同標簽之間可以建立 起一個

5、繼承關(guān)系,這樣構(gòu)建新的自定義標簽時,可以對已有起一個繼承關(guān)系,這樣構(gòu)建新的自定義標簽時,可以對已有 的標簽進行某種程度的升級或改進,而不需要重新創(chuàng)建,提的標簽進行某種程度的升級或改進,而不需要重新創(chuàng)建,提 高了開發(fā)效率。高了開發(fā)效率。 2.增加了可復(fù)用性。我們可以將自定義標簽打包成一個增加了可復(fù)用性。我們可以將自定義標簽打包成一個 Java檔案文件,以便在不同應(yīng)用之間自由移植。檔案文件,以便在不同應(yīng)用之間自由移植。 login 標簽處理類的規(guī)范由標簽處理類的規(guī)范由Tag接口定義。如果要建立帶標簽體接口定義。如果要建立帶標簽體 的標簽處理類,可以實現(xiàn)的標簽處理類,可以實現(xiàn)BodyTag接口。接口

6、。BodyTag接口是接口是 Tag接口的子接口。接口的子接口。 為了簡化開發(fā),為了簡化開發(fā),JSP規(guī)范又定義了一些輔助類。例如:規(guī)范又定義了一些輔助類。例如:Tag 接口對應(yīng)輔助類為接口對應(yīng)輔助類為TagSupport類。類。BodyTag接口對應(yīng)接口對應(yīng) BodyTagSupport類。類。 Tag接口中,主要定義的是和標簽生命周期相關(guān)的方法和接口中,主要定義的是和標簽生命周期相關(guān)的方法和 Tag接口常量接口常量 Tag接口方法接口方法 (1)public void setPageContext(PageContext pc) 當容器創(chuàng)建一個新的標簽后,通過當容器創(chuàng)建一個新的標簽后,通過s

7、etPageContext方法來設(shè)置標簽的頁面上下文。方法來設(shè)置標簽的頁面上下文。 (2)public void setParent(Tag t) 如果標簽嵌套使用如果標簽嵌套使用setParent方法設(shè)置這個標簽的父標簽,如果沒有上一級嵌套,設(shè)置為方法設(shè)置這個標簽的父標簽,如果沒有上一級嵌套,設(shè)置為 null。 (3)public Tag getParent() 如果標簽嵌套,該方法用來獲得父標簽,如果不是,就不調(diào)用該類方法。如果標簽嵌套,該方法用來獲得父標簽,如果不是,就不調(diào)用該類方法。 (4)public int doStartTag() throws JspException 調(diào)用調(diào)用

8、doStartTag方法,方法,JSP容器遇到自定義標簽的起始標志時執(zhí)行,這個方法可以返回容器遇到自定義標簽的起始標志時執(zhí)行,這個方法可以返回 兩個整數(shù)值 EVAL_BODY_INCLUDE 和和 SKIP_BODY,當返回,當返回EVAL_BODY_INCLUDE 時,就計算標簽體,如果返回時,就計算標簽體,如果返回 SKIP_BODY時,就不計算標簽體。時,就不計算標簽體。 (5) public int doEndTag() throws JspException 調(diào)用調(diào)用doEndTag方法,方法,JSP容器遇到自定義標簽的結(jié)束標志時執(zhí)行,這個方法可以返回容器遇到自定義標簽的結(jié)束標志時執(zhí)

9、行,這個方法可以返回 EVAL_PAGE 和和SKIP_PAGE,當返回,當返回 EVAL_PAGE 時,容器將在標簽結(jié)束時繼續(xù)計算時,容器將在標簽結(jié)束時繼續(xù)計算 JSP頁面的其他部分,如果返回頁面的其他部分,如果返回SKIP_PAGE,容器將在標簽結(jié)束時停止計算,容器將在標簽結(jié)束時停止計算JSP頁面的頁面的 其他部分。其他部分。 (6)public void release() 調(diào)用調(diào)用 release 方法釋放標簽處理程序占用的資源。方法釋放標簽處理程序占用的資源。 Tag接口常量接口常量 1.public static final int EVAL_BODY_INCLUDE 該常量作為該

10、常量作為doStartTag()方法的返回值,表示標簽體要被執(zhí)行,方法的返回值,表示標簽體要被執(zhí)行, 執(zhí)行結(jié)果輸出到當前的輸出流中。執(zhí)行結(jié)果輸出到當前的輸出流中。 2.public static final int SKIP_BODY 該常量作為該常量作為doStartTag()方法的返回值,表示忽略標簽體。方法的返回值,表示忽略標簽體。 3.public static final int EVAL_PAGE 該常量作為該常量作為doEndTag()方法的返回值,表示方法的返回值,表示JSP頁面的余下部分頁面的余下部分 將繼續(xù)執(zhí)行。將繼續(xù)執(zhí)行。 4.public static final in

11、t SKIP_PAGE 該常量作為該常量作為doEndTag()方法的返回值,表示忽略方法的返回值,表示忽略JSP頁面的余下頁面的余下 部分。部分。 package my.date; import java.io.*; import java.util.*; import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; public class DisplayDate extends TagSupport public DisplayDate() super();/調(diào)用父類的構(gòu)造方法調(diào)用父類的構(gòu)造方法 public int doS

12、tartTag() throws JspException JspWriter out = pageContext.getOut(); try out.print(new Date(); catch (IOException ioe) System.out.println(Failed to show date); return this.SKIP_BODY; 標簽庫描述文件(標簽庫描述文件(Tag Library Descriptor) 包含了自定義標簽的描述信息。它把自定義標包含了自定義標簽的描述信息。它把自定義標 簽和對應(yīng)的處理程序關(guān)聯(lián)起來。一個標簽庫對簽和對應(yīng)的處理程序關(guān)聯(lián)起來。一個標

13、簽庫對 應(yīng)一個標簽庫描述文件,一個標簽庫描述文件應(yīng)一個標簽庫描述文件,一個標簽庫描述文件 可以包含多個自定義標簽的聲明??梢园鄠€自定義標簽的聲明。 1.2 1.2 date This taglib provides tag to show date. displayDate my.date.DisplayDate empty 三、在三、在web.xml文件中配置元素文件中配置元素 以下是在以下是在web.xml中加入對自定義標簽庫的引用中加入對自定義標簽庫的引用 date /WEB-INF/date.tld 四、在四、在JSP文件中引入標簽庫文件中引入標簽庫 Today is 以下是上例運

14、行的結(jié)果以下是上例運行的結(jié)果 package my.test; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.TagSupport; public class OutputTag extends TagSupport private String name = null;/對應(yīng)于自定義標簽的對應(yīng)于自定義標簽的name屬性屬性 public void setName(String name) = name; p

15、ublic int doEndTag() throws JspException try JspWriter out = pageContext.getOut(); out.print(Hello! + name); catch (Exception e) throw new JspException(e); return EVAL_PAGE; 1.0 1.2 test out my.test.OutputTag empty name false false date /WEB-INF/date.tld test /WEB-INF/test.tld Test Tag: 客戶端客戶端 Clien

16、t JSP服務(wù)器服務(wù)器 JSP-Server JSP頁面頁面 JSP-Page 標記庫描述文件標記庫描述文件 TLD 標記處理程序標記處理程序 TagClass JSP文件文件 web.xml文件文件 test /WEB-INF/test.tld test.tld文件文件 out my.test.OutputTag OutputTag.java文件文件 doStartTag()()/doEndTag()() 有了上面的概念作為基礎(chǔ),現(xiàn)在我給出兩個簡單有了上面的概念作為基礎(chǔ),現(xiàn)在我給出兩個簡單 的實例,一個是用傳統(tǒng)的的實例,一個是用傳統(tǒng)的JSP頁面將內(nèi)容顯示,另頁面將內(nèi)容顯示,另 一個是使用了自

17、定義標簽的顯示相同的頁面內(nèi)容,一個是使用了自定義標簽的顯示相同的頁面內(nèi)容, 這樣好讓我們對標簽庫有一個感性的了解,從中這樣好讓我們對標簽庫有一個感性的了解,從中 體會兩者的區(qū)別和相同之處。體會兩者的區(qū)別和相同之處。 傳統(tǒng)的傳統(tǒng)的JSP 注冊用戶注冊用戶 用戶名用戶名 密密碼碼 確認密碼確認密碼 地址地址 電話電話 package my.tag; import java.io.IOException; import javax.servlet.jsp.JspTagException; import javax.servlet.jsp.JspWriter; import javax.servlet

18、.jsp.tagext.TagSupport; public class UserRegTag extends TagSupport public UserRegTag() public int doStartTag() throws JspTagException try JspWriter out = pageContext.popBody(); out.println(); out.println(用戶名); out.println(); out.println(密碼); out.println(); out.println(確認密碼); out.println(); out.print

19、ln(地址); out.println(); out.println(電話); out.println(); out.println(); catch (IOException e) e.printStackTrace(); return EVAL_BODY_INCLUDE; public int doEndTag() throws JspTagException return EVAL_PAGE; 使用了標簽庫的使用了標簽庫的JSP 注冊用戶注冊用戶 標簽庫使得標簽庫使得JSP的的web應(yīng)用程序非常易于維護,原因有:應(yīng)用程序非常易于維護,原因有: (1)標簽應(yīng)用簡單,對任何人而言都很容易使用

20、、易于理解。)標簽應(yīng)用簡單,對任何人而言都很容易使用、易于理解。 (2)所有的程序邏輯代碼都集中放在的標簽處理器和)所有的程序邏輯代碼都集中放在的標簽處理器和JavaBeans中。中。 這意味著在升級代碼時,無需要對每個使用該代碼的頁面進行修改,只需這意味著在升級代碼時,無需要對每個使用該代碼的頁面進行修改,只需 要修改集中的代碼文件便可。要修改集中的代碼文件便可。 (3)如果需要加入新的功能,也無需修改任何已經(jīng)存在的頁面,可以)如果需要加入新的功能,也無需修改任何已經(jīng)存在的頁面,可以 在標簽中加入額外的屬性,從而引進新的行為,而其它舊的屬性不變,這在標簽中加入額外的屬性,從而引進新的行為,而

21、其它舊的屬性不變,這 樣所有舊的頁面還可以正常工作。樣所有舊的頁面還可以正常工作。 例如有一個讓所有文本變藍的標簽:例如有一個讓所有文本變藍的標簽: My Text 但在后來項目中,又想讓藍色變暗。可以保留原有的標簽,只要為其但在后來項目中,又想讓藍色變暗??梢员A粼械臉撕灒灰獮槠?增加一個新的屬性:增加一個新的屬性:shade ,如下所示:,如下所示: My Text 所有舊的標簽仍然可以產(chǎn)生藍色的文本,但現(xiàn)在還可以使用同一標簽所有舊的標簽仍然可以產(chǎn)生藍色的文本,但現(xiàn)在還可以使用同一標簽 來產(chǎn)生變暗的藍色文本了。來產(chǎn)生變暗的藍色文本了。 (4)標簽提升了代碼的重用性。那些經(jīng)過多次測試和使

22、用的代碼肯定)標簽提升了代碼的重用性。那些經(jīng)過多次測試和使用的代碼肯定 具有更少的具有更少的bug。所以,使用定制標簽的。所以,使用定制標簽的JSP頁面也同樣具有更少的缺陷,頁面也同樣具有更少的缺陷, 維護起來自然方便多了。維護起來自然方便多了。 目前目前Web開發(fā)使用的標簽主要來自三個方面,一是開發(fā)使用的標簽主要來自三個方面,一是 自己定制;二是在網(wǎng)上找一些別人發(fā)布的標簽庫;三是自己定制;二是在網(wǎng)上找一些別人發(fā)布的標簽庫;三是 Java本省提供的一套標簽庫,那就是本省提供的一套標簽庫,那就是JSTL(Java Standard Tags Library)。從名稱上看,)。從名稱上看,JSTL是一是一 個個Java標準標簽庫,因此在這三個方面里,標準標簽庫,因此在這三個方面里,JSTL可以可以 說是穩(wěn)定性最高的選擇。說是穩(wěn)定性最高的選擇。 JSTL是一個不斷完善的開放是一個不斷完善的開放 源代碼的源代碼的JSP標簽庫,是由標

溫馨提示

  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論