<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    kapok

    垃圾桶,嘿嘿,我藏的這么深你們還能找到啊,真牛!

      BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      455 隨筆 :: 0 文章 :: 76 評(píng)論 :: 0 Trackbacks
    http://www-900.ibm.com/developerWorks/cn/java/j-pj2ee8/index.shtml

    內(nèi)容:
    JSP 自定義標(biāo)記
    實(shí)現(xiàn) JSP 自定義標(biāo)記
    第 1 步. 編寫標(biāo)記處理程序類
    第 2 步. 創(chuàng)建 TDL
    第 3 步. 使 TLD 和處理程序類可訪問
    第 4 步. 引用庫(kù)
    第 5 步. 在 JSP 頁(yè)面中使用這個(gè)標(biāo)記
    用 JSTL 節(jié)省時(shí)間
    結(jié)束語(yǔ)
    參考資料
    關(guān)于作者
    對(duì)本文的評(píng)價(jià)
    相關(guān)內(nèi)容:
    JSP 最佳實(shí)踐:taglib簡(jiǎn)介
    JSP 體系架構(gòu)
    JSTL 入門:表達(dá)式語(yǔ)言
    J2EE 探索者 系列
    IBM developer kits for Java (下載)
    developerWorks Toolbox 訂閱
    Java 專區(qū)中還有:
    教學(xué)
    工具與產(chǎn)品
    代碼與組件
    所有文章
    實(shí)用技巧
    在 JSP 頁(yè)面中使用自定義標(biāo)記的實(shí)用介紹

    級(jí)別:初級(jí)

    Kyle Gabhart (kyle@gabhart.com)
    顧問,Gabhart Communications
    2003 年 12 月

    Column iconJSP 自定義標(biāo)記為在動(dòng)態(tài) Web 頁(yè)中將表示與業(yè)務(wù)邏輯分離提供了一種標(biāo)準(zhǔn)化的機(jī)制,使頁(yè)面設(shè)計(jì)者可以將注意力放到表示上,而應(yīng)用程序開發(fā)人員編寫后端的代碼。在 J2EE 探索者 的這篇文章中,具有企業(yè)觀念的開發(fā)者 Kyle Gabhart 介紹了 JSP 自定義標(biāo)記的基本知識(shí),并引導(dǎo)您完成將它們加入到 JSP 頁(yè)面的五步過(guò)程。

    您可能聽說(shuō)現(xiàn)在有上百種不同的方式,但是在開發(fā) Web 應(yīng)用程序時(shí)將表示邏輯與業(yè)務(wù)邏輯分離是很重要的。近年來(lái),Java 平臺(tái)已經(jīng)發(fā)展為在體系結(jié)構(gòu)層次上加入了這種分離。例如,在 JSP 體系結(jié)構(gòu)中加入 JavaBean 組件使開發(fā)人員使用 JSP 標(biāo)記獲得和設(shè)置經(jīng)過(guò)特別編碼的 Java 組件上的屬性。這些組件或者 JavaBean 再代表表示層執(zhí)行后端業(yè)務(wù)處理。

    JSP 自定義標(biāo)記是 JSP/JavaBean 體系結(jié)構(gòu)的產(chǎn)物。像 JavaBean 技術(shù)一樣,自定義標(biāo)記有助于將表示邏輯與業(yè)務(wù)邏輯分離。并且自定義標(biāo)記成了 Web 設(shè)計(jì)者的 HTML、XML 和 Javascript 世界與軟件工程師的 Java 代碼、SQL 調(diào)用和算法世界之間的橋梁。

    在本月的 J2EE 探索者 中,您將學(xué)到在 JSP 頁(yè)中使用 JSP 自定義標(biāo)記的一些基本知識(shí)。我們首先介紹 JSP 標(biāo)記,然后直接進(jìn)入創(chuàng)建標(biāo)記、將它結(jié)合到 JSP 容器并在 JSP 頁(yè)面中使用它的過(guò)程。在本文的最后,我們將簡(jiǎn)要討論 Java 標(biāo)準(zhǔn)標(biāo)記庫(kù)(Java Standard Tag Library, JSTL),這是一組可以在您的 Java 開發(fā)項(xiàng)目中使用的、標(biāo)準(zhǔn)化的 JSP 自定義標(biāo)記。

    JSP 自定義標(biāo)記
    JSP 自定義標(biāo)記 是用戶定義的標(biāo)記,它遵循 JSP JavaBean 標(biāo)記(即 useBean、getProperty setProperty)所使用的一種特殊的 XML 語(yǔ)法。當(dāng) servlet 容器處理自定義標(biāo)記時(shí),會(huì)調(diào)用一個(gè)或者多個(gè) Java 類文件處理它,與用 Java 類文件處理 JSP 頁(yè)面的 JavaBean 調(diào)用的方式基本一樣。處理標(biāo)記以后,容器將取其名字和屬性、以及標(biāo)記正文中可能有的任何內(nèi)容,并將它傳遞給一個(gè)或者多個(gè)類文件進(jìn)行處理。

    Java 開發(fā)人員編寫標(biāo)記處理程序類以處理標(biāo)記并處理所有需要的 Java 代碼和數(shù)據(jù)操作。對(duì)于 Web 設(shè)計(jì)者來(lái)說(shuō),自定義標(biāo)記與標(biāo)準(zhǔn) HTML 標(biāo)記除了都可以利用后端動(dòng)態(tài)數(shù)據(jù)外,它們看上去與使用起來(lái)沒什么區(qū)別。正確編寫自定義標(biāo)記可以讓 Web 設(shè)計(jì)者創(chuàng)建、查詢和操作數(shù)據(jù)而無(wú)需編寫一行 Java 代碼。正確使用自定義標(biāo)記使 Java 開發(fā)人員不必再在編碼過(guò)程中考慮表示層。這樣應(yīng)用程序開發(fā)小組的每一位成員都可以關(guān)注于他或者她最擅長(zhǎng)的事物。

    實(shí)現(xiàn) JSP 自定義標(biāo)記
    JSP 體系結(jié)構(gòu)需要以下組件以實(shí)現(xiàn)自定義標(biāo)記:

    • 在每一頁(yè)中有一個(gè) JSP 聲明
    • Web 應(yīng)用程序描述符(web.xml)中的一個(gè)項(xiàng)
    • 一個(gè)包含特殊 XML 文件和為處理自定義標(biāo)記而調(diào)用的 Java 類的 JAR 文件

    在下面幾節(jié),您將一步一步地學(xué)習(xí)如何滿足這些要求并將自定義標(biāo)記加入到 JSP 頁(yè)面中。要想成功實(shí)現(xiàn) JSP 自定義標(biāo)記,您需要采取下面五個(gè)步驟:

    1. 編寫標(biāo)記處理程序類。
    2. 創(chuàng)建標(biāo)記庫(kù)描述符(TLD)。
    3. 使 TLD 文件和處理程序類可訪問。
    4. 引用標(biāo)記庫(kù)。
    5. 在 JSP 頁(yè)面中使用標(biāo)記。

    這些內(nèi)容是相當(dāng)基本的,也不用花很長(zhǎng)時(shí)間。就讓我們開始吧。

    第 1 步. 編寫標(biāo)記處理程序類
    在下面的例子中,我們將使用一個(gè)非常簡(jiǎn)單的顯示當(dāng)前時(shí)間和日期的自定義標(biāo)記例子。下面就是 DateTag

    
    <abc:displayDate />
    

    我們要做的第一件事是編寫標(biāo)記處理程序類。在執(zhí)行引用自定義標(biāo)記的 JSP 頁(yè)面時(shí),JSP 容器判斷每一個(gè)自定義標(biāo)記。當(dāng)容器遇到一個(gè)標(biāo)記時(shí),它調(diào)用與這個(gè)自定義標(biāo)記相關(guān)聯(lián)的標(biāo)記處理程序,我們將在后面更多地討論這個(gè)過(guò)程。然后,每一個(gè)標(biāo)記處理程序?qū)崿F(xiàn) JSP API 中的一個(gè)特殊接口。標(biāo)記有兩種類型:可以處理標(biāo)記內(nèi)容(或者正文)的標(biāo)記和不能處理標(biāo)記內(nèi)容的標(biāo)記:

    <abc:tagWithNoBody attribute="value"/>			
    <abc:tagWithBody attribute="value">
    	This is some body content that the tag handler can operate upon.
    </abc:tagWithBody>

    DateTag 例子中不需要加入正文內(nèi)容,因?yàn)樗伙@示當(dāng)前日期。因此,我們的處理程序類將實(shí)現(xiàn) Tag 接口(一般是通過(guò)擴(kuò)展 TagSupport 類)。如果我們要?jiǎng)?chuàng)建一個(gè)可以處理正文的標(biāo)記,那么我們就需要實(shí)現(xiàn) BodyTag 接口(一般是通過(guò)擴(kuò)展 BodyTagSupport 類)。清單 1 顯示了 DateTag 的處理程序類:

    清單 1. 標(biāo)記處理程序類
    
    package myTags;
    
    import javax.servlet.jsp.tagext.*;
    import javax.servlet.jsp.*;
    import javax.servlet.http.*;
    import java.text.*;
    import java.util.*;
    
    public DateTag extends TagSupport {
      
    	public int doStartTag() throws javax.servlet.jsp.JspException {
    		HttpServletRequest 	req;
       		Locale 				locale;
       		HttpJspPage  		g;
       		DateFormat			df;
       		String				date;
       		JSPWriter			out;
       				
       		req = ( HttpServletRequest )pageContext.getRequest();
       		locale = req.getLocale();
       		df = SimpleDateFormat.getDateInstance( 
       		        SimpleDateFormat.FULL,locale );
       		date = df.format( new java.util.Date() );
       				
       		try {
         		out = pageContext.getOut();
         		out.print( date );
       		} catch( IOException ioe ) {
         		throw new JspException( "I/O Error : " + ioe.getMessage() );
       		}//end try/catch
    
        	return Tag.SKIP_BODY;
    
      	}//end doStartTag()
    }//end DateTag
    

    關(guān)于這段代碼的說(shuō)明
    關(guān)于 DateTag 處理程序類有幾件事值得一說(shuō)。首先看一下方法聲明。如果我們直接實(shí)現(xiàn) Tag 接口,那么就需要完成幾個(gè)方法聲明。因?yàn)?TagSupport 類是簡(jiǎn)單的、具體類,它完全實(shí)現(xiàn)了在 Tag 接口中聲明的方法,我們可以只實(shí)現(xiàn)那些在自定義標(biāo)記中要使用的方法。在這個(gè)簡(jiǎn)單的例子中,我們只實(shí)現(xiàn)了 doStartTag() 方法,它是在遇到開始標(biāo)記時(shí)調(diào)用的。

    您還可能注意到 doStartTag() 方法返回 SKIP_BODY。當(dāng)然其原因是我們的簡(jiǎn)單日期標(biāo)記沒有正文。您要注意的最后一件重要的事情是使用了 pageContext 對(duì)象訪問輸出緩存以直接向輸出流發(fā)送內(nèi)容。您可能還記得在本系列以前的文章說(shuō)過(guò),pageContext 對(duì)象是一個(gè)隱式對(duì)象,它提供對(duì)與當(dāng)前頁(yè)面有關(guān)的屬性的訪問。

    編寫了源代碼文件后,我們像編譯所有其他 Java 類一樣編譯這個(gè)類(確保在類路徑中加入 Servlet/JSP JAR 文件),然后將編譯的類文件放到 Web 應(yīng)用程序的類目錄(WEB-INF/classes)中。如果我們開發(fā)的是幾個(gè)標(biāo)記或者定義有標(biāo)記變量的標(biāo)記,那么我們就會(huì)有多個(gè)標(biāo)記處理程序類。在這種情況下我們可能選擇將處理程序類打包在一個(gè) JAR 文件中而不是使它們成為類目錄中的分散的文件。

    第 2 步. 創(chuàng)建 TLD
    下一步是定義包含自定義標(biāo)記與處理它的 Java 類(或多個(gè)類)之間的映射的庫(kù)。這個(gè)庫(kù)是在一個(gè)名為標(biāo)記庫(kù)描述符(TLD)的 XML 文檔中定義的。我們將從 DateTag 例子 DateTagLib.tld 中調(diào)用這個(gè) TLD。注意“.tld”是這種文件的標(biāo)準(zhǔn)擴(kuò)展名。

    清單 2. DateTagLib.tld 文件
    		
    <?xml version="1.0" encoding="ISO-8859-1" ?>
    
    <taglib>
       <tlibversion>1.0</tlibversion>
       <info>A simple tag library</info>
    
      <tag>
        <name>displayDate</name>
        <tagclass>myTags.DateTag</tagclass>
        <bodycontent>empty</bodycontent>
        <info>Display Date</info>
      </tag>         
    </taglib>
    

    DateTagLib.tld 是一個(gè)出色的、最小的標(biāo)記庫(kù)描述符文件。所有關(guān)鍵信息都包含在 Tag 標(biāo)記中,在這里映射了標(biāo)記名和處理程序類,我們聲明了標(biāo)記對(duì)于正文內(nèi)容的敏感性。對(duì)于更復(fù)雜的情況,我們可以使用其他的 XML 標(biāo)記以提供有關(guān)庫(kù)和標(biāo)記的更多信息。在一個(gè)庫(kù)中定義多個(gè)標(biāo)記也很常見。

    第 3 步. 使 TLD 和處理程序類可訪問
    第 3 步是使這個(gè)類或者這些類和 TLD 可以被 Web 應(yīng)用程序訪問。有兩種方法:可以將類和 TLD 打包到一個(gè) JAR 文件中,再將這個(gè) JAR 文件儲(chǔ)存在 Web 應(yīng)用程序的 lib 目錄中,也可以將類文件分散地放到 classes 子目錄中并將 TLD 文件放到 Web 應(yīng)用程序的 WEB-INF 目錄下面的某一位置。

    在這個(gè)例子中,我們將使用第二種方法,將 TLD 文件和類分散地放到 Web 應(yīng)用程序目錄結(jié)構(gòu)中。您可以回憶起在第 1 步中我們已經(jīng)將標(biāo)記處理程序類放到了 classes 目錄中,所以我們實(shí)際上只需儲(chǔ)存 TLD 文件。TLD 文件被儲(chǔ)存在 WEB-INF 目錄或者子目錄中,如果是部署 Java 文件,則儲(chǔ)存在 JAR 的 META-INF/ 目錄或者子目錄。在這里,我們沒有使用 JAR 文件,所以我們只將 TLD 儲(chǔ)存到 Web 應(yīng)用程序的 WEB-INF/lib 目錄中。

    第 4 步. 引用這個(gè)庫(kù)
    這時(shí),我們已經(jīng)編譯了標(biāo)記處理程序類、創(chuàng)建了 TLD 文件以定義處理程序類和標(biāo)記之間的映射、并保證類和標(biāo)記在應(yīng)用程序中都是可訪問的。下一步是建立 JSP 頁(yè)面與標(biāo)記庫(kù)之間的引用。有兩種方法聲明 JSP 頁(yè)面與其庫(kù)之間的引用??梢酝ㄟ^(guò) Web 應(yīng)用程序描述符(web.xml)聲明一個(gè)靜態(tài)引用,也可以直接在頁(yè)面中聲明一個(gè)動(dòng)態(tài)引用。我們將試用這兩種方法。

    為了進(jìn)行靜態(tài)引用,首先必須將下面的項(xiàng)加入到 web.xml 文件中:

    
    <?xml version="1.0" encoding="ISO-8859-1" ?>
    
    <Web-app>
       
       <!-- Define Servlets, Servlet Mappings, etc. -->
                
       <taglib>
          <taglib-uri>myTags</taglib-uri>
          <taglib-location>/WEB-INF/lib/DateTagLib.tld</taglib-location>
       </taglib>
       			            
    </Web-app>
    

    然后,將 JSP 聲明加入到所有需要使用自定義標(biāo)記庫(kù)的頁(yè)面中:

    
    <%@ taglib uri="myTags" prefix="abc" %>
    

    注意指定的 uri 屬性與在 web.xml 文件中指定的 taglib-uri 值相匹配。

    為了進(jìn)行動(dòng)態(tài)引用,只需在所有需要使用這個(gè)庫(kù)的頁(yè)面中加入一個(gè) JSP 聲明即可:

    
    <%@ taglib uri="/WEB-INF/lib/DateTagLib.tld" prefix="abc" %>
    

    靜態(tài)引用與動(dòng)態(tài)引用的比較
    在進(jìn)行標(biāo)記庫(kù)的靜態(tài)引用時(shí),JSP 聲明必須查詢 web.xml 文件以執(zhí)行庫(kù)查詢。這意味著如果移動(dòng)或者重命名了庫(kù),或者希望在 web.xml 文件中加入更多的庫(kù),就必須停止服務(wù)器、更新 web.xml 文件、然后重新啟動(dòng)服務(wù)器。動(dòng)態(tài)方法讓 JSP 頁(yè)直接指向 TLD 位置,因而是在解釋 JSP 頁(yè)面時(shí)進(jìn)行處理。

    靜態(tài)方法提供了頁(yè)面與庫(kù)的實(shí)際名和位置之間一定程度的非直接性,這可以為您提供一些改變這些屬性而不修改頁(yè)面的靈活性。另一方面,動(dòng)態(tài)方法提供了更大的靈活性,讓您可以在運(yùn)行時(shí)增加和移動(dòng)標(biāo)記聲明。如果您對(duì)動(dòng)態(tài)方法感興趣,但是又擔(dān)心做了一些改變后、有可能要更新多個(gè)頁(yè)面的維護(hù)負(fù)擔(dān),那么您可以始終將 JSP 聲明放到一個(gè)單獨(dú)的 JSP 文件中,并在每一個(gè)要訪問 Web 應(yīng)用程序的自定義庫(kù)的頁(yè)面中加入這一頁(yè)。這使您具有在運(yùn)行時(shí)只需要更新信息一次就可以增加庫(kù)的靈活性。

    第 5 步. 在 JSP 頁(yè)面中使用標(biāo)記
    完成了所有這些準(zhǔn)備工作后,我們就可以在 JSP 頁(yè)面中使用這些自定義標(biāo)記了。清單 3 顯示了包含 DateTag 的 JSP 頁(yè)面的瀏覽器輸出:

    清單 3. 帶有自定義標(biāo)記的 JSP 頁(yè)
    
    <%@ taglib uri="/WEB-INF/lib/DateTagLib.tld"  prefix="abc" %>
    <HTML>
    	<HEAD>
    		<TITLE>Date tag example</TITLE>
    	</HEAD>
    	
    	<BODY>
    		<H1>Date tag Example</H1>
    		<p>Hi today is <b><abc:displayDate /></b> </p>
    	</BODY>
    </HTML>
    

    重新啟動(dòng) Web 服務(wù)器并測(cè)試自己的 JSP 頁(yè)面 !結(jié)果看起來(lái)類似于圖 1 所示。

    圖 1. DateTag 的瀏覽器輸出
    DateTag 的瀏覽器輸出

    用 JSTL 節(jié)省時(shí)間
    您所需要的自定義標(biāo)記功能中也許有多達(dá)百分之八十已經(jīng)由 J2EE 團(tuán)體創(chuàng)建并標(biāo)準(zhǔn)化了。使用現(xiàn)有的標(biāo)記庫(kù)而不是從頭創(chuàng)建所有東西會(huì)使您節(jié)省大量時(shí)間和精力。盡管在公共域有數(shù)十種庫(kù),不過(guò)業(yè)界匯集了一個(gè)特定的自定義庫(kù)。Java 標(biāo)準(zhǔn)標(biāo)記庫(kù)(JSTL)是由 Java Community Process 設(shè)計(jì)的,其參考實(shí)現(xiàn)是由 Apache Group 通過(guò) Jakarta Taglibs 項(xiàng)目所開發(fā)和維護(hù)的(參閱參考資料)。

    JSTL 定義了針對(duì)常見 Web 應(yīng)用程序處理需求,如變量支持、流程控制、URL 管理、XML 操作、國(guó)際化、數(shù)據(jù)庫(kù)訪問等等的標(biāo)記。除了一組豐富的標(biāo)記外,JSTL 還定義了自己的表達(dá)式語(yǔ)言(EL)。EL 使我們可以容易地訪問應(yīng)用程序數(shù)據(jù)并更容易在不使用腳本或者請(qǐng)求時(shí)表達(dá)式的條件下操作這些數(shù)據(jù)。

    除了節(jié)省您從頭開發(fā)所有標(biāo)記的時(shí)間和精力,JSTL 還具有標(biāo)準(zhǔn)化和業(yè)界承認(rèn)的所有好處。這些好處包括廠商支持、大量介紹文字、以及有很大的機(jī)會(huì)找到具有 JSTL 經(jīng)驗(yàn)的雇員或者承包商。

    結(jié)束語(yǔ)
    在 J2EE Web 開發(fā)中越來(lái)越多地需要將業(yè)務(wù)和表示邏輯分離,JSP 自定義標(biāo)記提供了替代簡(jiǎn)單的老 JavaBean 和 Java 腳本的一個(gè)有吸引力的方法。更好的是在 JSTL 中已存在一組已定義的標(biāo)準(zhǔn)的自定義標(biāo)記庫(kù)。在 J2EE 探索者 的這篇文章中,您經(jīng)歷了從頭創(chuàng)建一個(gè)自定義標(biāo)記并在 JSP 頁(yè)面中實(shí)現(xiàn)它的過(guò)程。我還簡(jiǎn)單介紹了 JSTL 并闡述了使用它而不是從頭創(chuàng)建所有的自定義標(biāo)記的好處。

    下個(gè)月,我們將繼續(xù)探索 J2EE 技術(shù),對(duì) Web 應(yīng)用程序安全體系結(jié)構(gòu)進(jìn)行分析。祝這段時(shí)間里探索快樂!

    參考資料

    關(guān)于作者
    Photo of Kyle GabhartKyle Gabhart 是一名自由顧問,J2EE、XML 和 Web 服務(wù)技術(shù)方面的專家。Kyle 還是一位深受歡迎的公眾演講者,以其對(duì)新興技術(shù)的熱情以及生動(dòng)精辟的分析和表述而聞名。要獲取有關(guān)他最近以及即將舉行的演講或即將發(fā)表的業(yè)內(nèi)出版物的信息,請(qǐng)?jiān)L問 Gabhart.com。可以通過(guò) kyle@gabhart.com 與他聯(lián)系。


    posted on 2005-04-08 16:31 笨笨 閱讀(316) 評(píng)論(0)  編輯  收藏 所屬分類: J2EE 、ALL
    主站蜘蛛池模板: 亚洲av日韩综合一区二区三区 | 中文字幕无码视频手机免费看| 日韩亚洲翔田千里在线| 亚洲一区免费观看| 日韩在线永久免费播放| 全部一级一级毛片免费看| 最新亚洲卡一卡二卡三新区| 日日AV拍夜夜添久久免费| 国产成人综合亚洲绿色| 亚洲毛片在线免费观看| 日本免费福利视频| 国产大片免费网站不卡美女 | 18禁免费无码无遮挡不卡网站| 久久嫩草影院免费看夜色| 真正全免费视频a毛片| 亚洲依依成人亚洲社区| 亚洲天堂中文字幕在线| 四虎在线最新永久免费| 搜日本一区二区三区免费高清视频| 国产亚洲av片在线观看16女人| 丁香花免费完整高清观看| 久久免费观看国产99精品| 99久久精品毛片免费播放| 一级成人毛片免费观看| 免费福利资源站在线视频| 在线亚洲精品视频| 日韩亚洲人成在线综合| 亚洲大尺度无码无码专线一区| 亚洲日本国产综合高清| 亚洲中文字幕无码爆乳| 学生妹亚洲一区二区| 亚洲午夜在线播放| 99亚偷拍自图区亚洲| 亚洲综合无码一区二区痴汉| 亚洲日韩乱码中文字幕| 亚洲成AV人片在| 亚洲AV综合色一区二区三区| 国产国产成年年人免费看片| 2021精品国产品免费观看| 99久久国产免费中文无字幕| 8090在线观看免费观看|