java web程序開發(fā)入門_第1頁
java web程序開發(fā)入門_第2頁
java web程序開發(fā)入門_第3頁
java web程序開發(fā)入門_第4頁
java web程序開發(fā)入門_第5頁
已閱讀5頁,還剩95頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

JavaWeb程序開發(fā)入門注:因內(nèi)容過長上傳受限制,本文檔只顯示部分內(nèi)容,完整版文檔請下載此文檔后留言謝謝。目錄\h第1章XML基礎\h1.1XML概述\h1.1.1W3C組織簡介\h1.1.2什么是XML\h1.1.3XML與HTML的比較\h1.2XML語法\h1.2.1文檔聲明\h1.2.2元素定義\h1.2.3屬性定義\h1.2.4注釋\h1.2.5特殊字符處理\h1.2.6CDATA區(qū)\h1.3DTD約束\h1.3.1什么是約束\h1.3.2DTD約束\h1.3.3DTD語法\h1.4Schema約束\h1.4.1什么是Schema約束\h1.4.2名稱空間\h1.4.3引入Schema文檔\h1.4.4Schema語法\h小結(jié)\h測一測\h第2章Tomcat開發(fā)Web站點\h2.1Web開發(fā)的相關知識\h2.1.1B/S架構(gòu)和C/S架構(gòu)\h2.1.2通信協(xié)議\h2.1.3Web資源\h2.2安裝Tomcat\h2.2.1Tomcat簡介\h2.2.2Tomcat的安裝和啟動\h2.2.3Tomcat診斷\h2.3發(fā)布Web應用\h2.3.1什么是Web應用\h2.3.2配置Web應用虛擬目錄\h2.3.3配置Web應用默認頁面\h2.3.4Tomcat的管理平臺\h2.4配置虛擬主機\h2.5Eclipse中配置Tomcat服務器\h小結(jié)\h測一測\h第3章HTTP協(xié)議\h3.1HTTP概述\h3.1.1HTTP介紹\h3.1.2HTTP1.0和HTTP1.1\h3.1.3HTTP消息\h3.2HTTP請求消息\h3.2.1HTTP請求行\(zhòng)h3.2.2HTTP請求消息頭\h3.3HTTP響應消息\h3.3.1HTTP響應狀態(tài)行\(zhòng)h3.3.2HTTP響應消息頭\h3.4HTTP其他頭字段\h3.4.1通用頭字段\h3.4.2實體頭字段\h小結(jié)\h測一測\h第4章Servlet技術(shù)\h4.1Servlet開發(fā)入門\h4.1.1Servlet接口\h4.1.2實現(xiàn)第一個Servlet程序\h4.1.3Servlet的生命周期\h4.2Servlet高級應用\h4.2.1HttpServlet\h4.2.2使用Eclipse工具開發(fā)Servlet\h4.2.3Servlet虛擬路徑的映射\h4.3ServletConfig和ServletContext\h4.3.1ServletConfig接口\h4.3.2ServletContext接口\h小結(jié)\h測一測\h第5章請求和響應\h5.1HttpServletResponse對象\h5.1.1發(fā)送狀態(tài)碼相關的方法\h5.1.2發(fā)送響應消息頭相關的方法\h5.1.3發(fā)送響應消息體相關的方法\h5.2HttpServletResponse應用\h5.2.1中文輸出亂碼問題\h5.2.2網(wǎng)頁定時刷新并跳轉(zhuǎn)\h5.2.3禁止瀏覽器緩存頁面\h5.2.4請求重定向\h5.3HttpServletRequest對象\h5.3.1獲取請求行信息的相關方法\h5.3.2獲取請求消息頭的相關方法\h5.3.3獲取請求消息體的相關方法\h5.4HttpServletRequest應用\h5.4.1獲取請求參數(shù)\h5.4.2請求參數(shù)的中文亂碼問題\h5.4.3獲取網(wǎng)絡連接信息\h5.4.4通過Request對象傳遞數(shù)據(jù)\h5.5RequestDispatcher對象的應用\h5.5.1RequestDispatcher接口\h5.5.2請求轉(zhuǎn)發(fā)\h5.5.3請求包含\h小結(jié)\h測一測\h第6章會話及其會話技術(shù)\h6.1會話概述\h6.2Cookie對象\h6.2.1什么是Cookie\h6.2.2CookieAPI\h6.3Cookie案例——顯示用戶上次訪問時間\h6.4Session對象\h6.4.1什么是Session\h6.4.2HttpSessionAPI\h6.4.3Session超時管理\h6.5Session案例——實現(xiàn)購物車\h6.5.1需求分析\h6.5.2案例實現(xiàn)\h6.6Session案例——實現(xiàn)用戶登錄\h6.6.1需求分析\h6.6.2案例實現(xiàn)\h小結(jié)\h測一測\h第7章JSP技術(shù)\h7.1JSP概述\h7.1.1什么是JSP\h7.1.2JSP運行原理\h7.1.3分析JSP所生成的Servlet代碼\h7.2JSP基本語法\h7.2.1JSP模板元素\h7.2.2JSP表達式\h7.2.3JSP腳本片段\h7.2.4JSP聲明\h7.2.5JSP注釋\h7.3JSP指令\h7.3.1page指令\h7.3.2include指令\h7.4JSP隱式對象\h7.4.1隱式對象\h7.4.2out對象\h7.4.3pageContext對象\h7.4.4exception對象\h7.5JSP標簽\h7.5.1<jsp:include>標簽\h7.5.2<jsp:forward>標簽\h小結(jié)\h測一測\h第8章JavaBean組件\h8.1初識JavaBean\h8.1.1什么是JavaBean\h8.1.2訪問JavaBean的屬性\h8.2反射\h8.2.1認識Class類\h8.2.2通過反射創(chuàng)建對象\h8.2.3通過反射訪問屬性\h8.2.4通過反射調(diào)用方法\h8.3內(nèi)省\h8.3.1什么是內(nèi)省\h8.3.2修改JavaBean的屬性\h8.3.3讀取JavaBean的屬性\h8.4JSP標簽訪問JavaBean\h8.4.1<jsp:useBean>標簽\h8.4.2<jsp:setProperty>標簽\h8.4.3<jsp:getProperty>標簽\h8.5BeanUtils工具\h8.5.1什么是BeanUtils\h8.5.2案例——BeanUtils工具訪問JavaBean的屬性\h小結(jié)\h測一測\h第9章JSP開發(fā)模型\h9.1JSP開發(fā)模型\h9.1.1JSPModel\h9.1.2MVC設計模式\h9.2JSPModel1案例\h9.3JSPModel2案例\h9.3.1案例分析\h9.3.2案例實現(xiàn)\h小結(jié)\h測一測\h附錄:參看CD鏈接第1章XML基礎學習目標掌握XML的概念,可以區(qū)分XML與HTML的不同。掌握XML語法,學會定義XML。掌握DTD約束,會使用DTD對XML文檔進行約束。掌握Schema約束,熟練使用Schema對XML文檔進行約束。1.1XML概述在實際開發(fā)中,由于不同操作系統(tǒng)存儲數(shù)據(jù)的格式不兼容,因此,當這些系統(tǒng)在進行數(shù)據(jù)傳輸時,勢必會變得很困難。為此,W3C組織推出了一種新的數(shù)據(jù)交換標準——XML,它是一種通用的數(shù)據(jù)交換格式,可以使數(shù)據(jù)在各種應用程序之間輕松地實現(xiàn)數(shù)據(jù)的交換。本章的學習目的就是為了幫助讀者快速了解和掌握XML,為后面深入學習JavaWeb開發(fā)技術(shù)奠定基礎。1.1.1W3C組織簡介W3C是WorldWideWebConsortium(萬維網(wǎng)聯(lián)盟)的縮寫,它是對網(wǎng)絡標準定制的一個非贏利組織,如HTML、XHTML、CSS、XML的標準就是由W3C來制定的。由于Web標準的制定無論在影響范圍或投資方面都很重要,因此,它不能夠由任何一家組織單獨控制。在這種情況下,W3C組織實現(xiàn)了會員制度。W3C組織的會員包括軟件開發(fā)商、內(nèi)容提供商、企業(yè)用戶、通信公司、研究機構(gòu)、研究實驗室、標準化團體以及政府,會員中包括一些知名IT企業(yè),如IBM、Microsoft、AmericaOnline、Apple、Adobe、Macromedia和SunMicrosystems等。W3C組織制定了一系列標準。由W3C正式發(fā)布的標準稱為W3C推薦標準,一項技術(shù)要成為W3C的推薦標準,需要經(jīng)過7個步驟。1.W3C收到一份提交任何W3C的成員都可以向聯(lián)盟提交希望成為Web標準的某項建議,如果建議的內(nèi)容在W3C的工作范圍之內(nèi),W3C將決定是否要對此展開工作。2.由W3C發(fā)布一份記錄通常,一項對W3C的提交會成為一份記錄,記錄是對某項建議的描述,它作為一份公共文檔僅供討論使用。記錄的發(fā)布并不代表W3C對其認可。記錄可在任何時間被更新、替換或者廢棄。記錄的內(nèi)容由提交此記錄的會員來編輯,而不是W3C。記錄的發(fā)布也不表明W3C已啟動與此記錄相關的任何工作。3.由W3C創(chuàng)建一個工作組當某項提交建議被W3C認可后,一個工作組就會成立,其中包括會員和其他有興趣的團體。工作組通常會定義一個時間表,并發(fā)布有關被提議標準的工作草案。4.由W3C發(fā)布一份工作草案W3C工作草案通常會被發(fā)布于W3C的網(wǎng)站上,工作草案會說明當前工作的進展,由于其內(nèi)容可在任何時間被更新、替換或廢棄,因此它不應該被作為工作的參考材料。5.由W3C發(fā)布一份候選的推薦標準當某些規(guī)范比較復雜時,它可能需要會員和軟件開發(fā)商花費更多的經(jīng)費、時間來測試。這些規(guī)范可能會作為候選推薦標準來發(fā)布。候選推薦標準同工作草案一樣,也是一種“正在進行的工作”,同樣不應被作為工作的參考材料。因為此文檔可能在任何時間被更新、替換或廢棄。6.由W3C發(fā)布一份被提議的推薦標準提議的推薦標準的發(fā)布意味著工作組中工作的最后階段。提議的推薦標準也是一種“正在進行的工作”。此文檔可在任何時間被更新、替換或廢棄。不過,即使它不意味著W3C任何官方的認可,在極多的情況下,提議的推薦標準無論在內(nèi)容還是時間上都已接近于最后的推薦標準。7.由W3C發(fā)布推薦標準W3C推薦標準已經(jīng)通過了W3C會員們的評審,并得到了W3C主任的正式批準。W3C推薦標準是一份穩(wěn)定的文檔,可被用作參考材料。1.1.2什么是XML在現(xiàn)實生活中,很多事物之間都存在著一定的關聯(lián)關系,例如中國有很多省份,每個省份下又有很多城市。這些省市之間的關聯(lián)關系可以通過一張樹狀結(jié)構(gòu)圖來描述,具體如圖1-1所示。圖1-1城市關系圖圖1-1直觀地描述了中國與所轄省、市之間的層次關系。但是對于程序而言,解析圖片內(nèi)容非常困難,這時,采用XML文件保存這種具有樹狀結(jié)構(gòu)的數(shù)據(jù)是最好的選擇。XML是EXtensibleMarkupLanguage的縮寫,它是一種類似于HTML的標記語言,稱為可擴展標記語言。所謂可擴展,指的是用戶可以按照XML規(guī)則自定義標記。下面通過一個XML文檔來描述如圖1-1所示的關系,如例1-1所示。例1-1city.xml

1<中國>

2<河北>

3<城市>張家口</城市>

4<城市>石家莊</城市>

5</河北>

6<山西>

7<城市>太原</城市>

8<城市>大同</城市>

9</山西>

10</中國>

在例1-1中,<中國>、<河北>、<城市>都是用戶自己創(chuàng)建的標記,它們都可稱為元素,這些元素必須成對出現(xiàn),即包括開始標記和結(jié)束標記。例如,在<中國>元素中的開始標記為<中國>,結(jié)束標記為</中國>。<中國>被視為整個XML文檔的根元素,在它下面有兩個子元素,分別是<河北>和<山西>,在這兩個子元素中又分別包含兩個<城市>元素。在XML文檔中,通過元素的嵌套關系可以很準確地描述具有樹狀層次結(jié)構(gòu)的復雜信息,因此,越來越多的應用程序都采用XML格式來存放相關的配置信息,從而便于讀取和修改。1.1.3XML與HTML的比較XML和HTML都是標記文本,它們在結(jié)構(gòu)上大致相同,都是以標記的形式來描述信息。但實際上它們有著本質(zhì)的區(qū)別,為了讓初學者不產(chǎn)生混淆,接下來對HTML和XML進行比較,具體如下。(1)HTML中的標記是用來顯示數(shù)據(jù)的,而XML中的標記用來描述數(shù)據(jù)的性質(zhì)和結(jié)構(gòu)。(2)HTML是不區(qū)分大小寫的,而XML是嚴格區(qū)分大小寫的。(3)HTML可以有多個根元素,而格式良好的XML有且只能有一個根元素。(4)HTML中,屬性值的引號是可用可不用的,而XML中屬性值必須放在引號中。(5)HTML中,空格是自動過濾的,而XML中空格則不會自動刪除。(6)HTML中的標記是預定義的,而XML中的標記是可以隨便定義的,并且可擴展。需要注意的是,XML不是HTML的升級,也不是HTML的替代產(chǎn)品,雖然兩者有些相似,但它們的應用領域和范圍完全不同。HTML規(guī)范的最終版本是HTML4.01,它已經(jīng)被XHTML取代。而XHTML是HTML和XML的混合物,它完全采用XML的語法規(guī)則來編寫Web頁面,有效地結(jié)合了HTML的簡單性和XML的可擴展性,并且XML可以應用在金融、科研等各個領域,而XHTML只是XML在Web領域的一種應用。1.2XML語法1.2.1文檔聲明在一個完整的XML文檔中,必須包含一個XML文檔的聲明,并且該聲明必須位于文檔的第一行。這個聲明表示該文檔是一個XML文檔,以及遵循哪個XML版本的規(guī)范。XML文檔聲明的語法格式如下所示:

<?xml版本信息[編碼信息][文檔獨立性信息]?>

從上面的語法格式中可以看出,文檔聲明以符號“<?”開頭,以符號“?>”結(jié)束,中間可以聲明版本信息,編碼信息以及文檔獨立性信息。需要注意的是,在“<”和“?”之間、“?”和“>”之間以及第一個“?”和“xml”之間不能有空格;另外,中括號([])括起來的部分是可選的。接下來,針對語法格式中的版本信息、編碼信息、文檔獨立性信息進行詳細講解,具體如下。1.版本聲明由于解析器對不同版本的XML文檔解析方式不同,因此在文檔聲明時,必須指定版本信息。版本聲明的具體示例如下所示:

<?xmlversion="1.0"?>

在上述版本聲明中,version屬性表示XML的版本。目前,最常用的XML版本是1.0。2.文檔編碼聲明由于人們可以采用不同的字符集編碼來書寫一個字符內(nèi)容完全相同的XML文檔,所以,XML軟件工具需要知道XML文檔所使用的編碼方式,這時,可以通過在XML文檔聲明中指定encoding屬性來說明。默認情況下,XML文檔使用的是UTF-8編碼方式。如果要將字符編碼聲明為GB2312,則示例代碼如下所示:

<?xmlversion="1.0"encoding="gb2312"?>

3.獨立文檔聲明如果我們的文檔不依賴外部文檔,在XML聲明中,可以通過standalone="yes"來聲明這個文檔是獨立的文檔。如果文檔依賴于外部文檔,可以通過standalone="no"來聲明。默認情況下,standalone屬性的值為no。一個完整的XML聲明如下所示:

<?xmlversion="1.0"encoding="gb2312"standalone="yes"?>

上面所提的依賴,是指文檔需要DTD文件驗證其中的標識是否有效,或者需要XSL、CSS文件控制顯示外觀等,關于DTD文件等相關知識,將在后面的章節(jié)中進行詳細講解。注意:XML聲明必須位于文檔的第一行,前面不能有任何字符。在XML聲明時,如果同時設置了encoding和standalone屬性,standalone屬性要位于encoding屬性之后。動手體驗:加深對encoding屬性的理解對于含有中文字符的XML文檔,其中的字符需要采用Unicode或GB2312(簡體中文字符編碼)編碼來表示;同時,XML文檔中字符使用的編碼方式必須和文檔聲明中的encoding屬性值一致,否則會發(fā)生中文亂碼問題。接下來,通過一個案例來演示encoding屬性的使用,具體步驟如下。(1)用Windows自帶的記事本程序創(chuàng)建一個名為book.xml的文件,文件內(nèi)容具體如例1-2所示。例1-2book.xml

1<?xmlversion="1.0"?>

2<書架>

3<書>

4<書名>Java就業(yè)培訓教程</書名>

5<作者>張孝祥</作者>

6<售價>58.00元</售價>

7</書>

8<書>

9<書名>EJB3.0入門經(jīng)典</書名>

10<作者>黎活明</作者>

11<售價>39.00元</售價>

12</書>

13</書架>

(2)用IE9.0以下的瀏覽器打開book.xml文件,結(jié)果如圖1-2所示。圖1-2運行結(jié)果從圖1-2中可以看出,瀏覽器在解析文檔時發(fā)生了錯誤,錯誤提示信息是“文本內(nèi)容中發(fā)現(xiàn)無效字符”。這是因為在book.xml文檔聲明語句中沒有指定文檔中的字符編碼方式,瀏覽器就會用默認的Unicode編碼來解析該文檔,而該文檔中的字符實際上使用的是GB2312編碼,而非Unicode編碼。需要注意的是,由于IE瀏覽器的不斷更新,IE9以上的瀏覽器在解析文檔時不會提示錯誤。(3)使用記事本程序打開book.xml文件,對第1行進行修改,指定encoding屬性的值為GB2312,具體如下:

<?xmlversion="1.0"encoding="GB2312"?>

保存修改后的內(nèi)容,刷新顯示book.xml文件的瀏覽器窗口,結(jié)果如圖1-3所示。圖1-3運行結(jié)果在圖1-3中,單擊某個標簽前面的減號(-),嵌套在該標簽中的所有內(nèi)容將被折疊起來,標簽前面的減號(-)也將變成加號(+)。單擊某個標簽前面的加號(+),嵌套在該標簽中的所有內(nèi)容將被展開,標簽前面的加號(+)也將變成減號(-)。(4)切換到記事本程序打開book.xml文件的窗口,連擊“文件”→“另存為”選項,在打開的“另存為”對話框中,選擇“所有文件”及UTF-8,具體如圖1-4所示。圖1-4保存方式在圖1-4中,以UTF-8編碼保存book.xml文件后,盡管在記事本程序窗口中顯示的效果沒有任何變化,但是book.xml文件內(nèi)部存儲的數(shù)據(jù)已經(jīng)改變,此時可以通過比較book.xml文件修改前后的大小來觀察。刷新顯示book.xml文件的瀏覽器窗口,結(jié)果如圖1-5所示。圖1-5運行結(jié)果從圖1-5可以看出發(fā)生了錯誤,錯誤提示為“不支持從當前編碼到指定編碼的切換”。這是因為現(xiàn)在的book.xml文件的字符編碼為UTF-8,而文檔聲明中指定encoding屬性為GB2312,因此,瀏覽器在解析book.xml文件時會發(fā)生錯誤。(5)將book.xml的文檔聲明的encoding屬性修改為UTF-8,保存后刷新顯示book.xml文件的瀏覽器窗口,顯示的結(jié)果如圖1-6所示。圖1-6運行結(jié)果1.2.2元素定義在XML文檔中,主體內(nèi)容都是由元素(Element)組成的。元素一般是由開始標記、屬性、元素內(nèi)容和結(jié)束標記構(gòu)成,具體示例如下:

<城市>北京</城市>

在上面的示例中,“<城市>”和“</城市>”就是XML文檔中的標記,標記的名稱也就是元素的名稱。在一個元素中可以嵌套若干子元素。如果一個元素沒有嵌套在其他元素內(nèi),則這個元素稱為根元素。根元素是XML文檔定義的第一個元素。如果一個元素中沒有嵌套子元素,也沒有包含文本內(nèi)容,則這樣的元素稱為空元素,空元素可以不使用結(jié)束標記,但必須在起始標記的“>”前增加一個正斜杠“/”來說明該元素是個空元素,例如:<img></img>可以簡寫成<img/>。在XML文檔中,元素的名稱可以包含字母、數(shù)字以及其他一些可見的字符,但是在命名XML元素時,應該遵守以下規(guī)范。(1)區(qū)分大小寫,例如:<P>和<p>是兩個不同的標記。(2)元素名稱中,不能包含空格、冒號、分號、逗號和尖括號等,元素不能以數(shù)字開頭,否則XML文檔會報錯。(3)建議不要使用“.”,因為在很多程序語言中,“.”用于引用對象的屬性。(4)建議不要用減號(-),而以下劃線(_)代替,以避免與表達式中的減號(-)運算符發(fā)生沖突。(5)建議名稱不要以字符組合xml(或XML、或Xml等)開頭。(6)建議名稱的大小寫盡量采用同一標準,要么全部大寫,要么全部小寫。(7)名稱可以使用非英文字符,例如中文,但有些軟件可能不支持非英文字符以外的字符,在使用時應考慮這種情況。1.2.3屬性定義在XML文檔中,可以為元素定義屬性。屬性是對元素的進一步描述和說明。在一個元素中,可以有多個屬性,并且每個屬性都有自己的名稱和取值,具體示例如下:

<售價單位="元">68</售價>

在上面的示例中,<售價>中定義了一個屬性“單位”。需要注意的是,在XML文檔中,屬性的命名規(guī)范同元素相同,屬性值必須要用雙引號("")或者單引號('')引起來,否則被視為錯誤。另外,屬性還可以通過子元素的形式來描述同樣的信息,例如,屬性定義的示例代碼可以改寫為以下代碼,具體如下:

<售價>

<價格>68</價格>

<單位>元</單位>

</售價>

1.2.4注釋如果想在XML文檔中插入一些附加信息,如作者姓名、地址或電話等信息,或者想暫時屏蔽某些XML語句,這時,可以通過注釋的方式來實現(xiàn),被注釋的內(nèi)容會被程序忽略而不被解析和處理。XML注釋和HTML注釋寫法基本一致,具體語法格式如下所示:

<!--注釋信息-->

從上述語法格式中可以看出,XML注釋非常簡單,但是,仍有一些細節(jié)問題需要注意,具體如下。(1)注釋不能出現(xiàn)在XML聲明之前,XML聲明必須是文檔的第一行,例如以下語句是非法的。

<!--address:czbk-->

<!--Date:2013-6-28-->

<?xmlversion="1.0"?>

(2)注釋不能出現(xiàn)在標記中,例如以下語句是非法的。

<greeting<!--Begingreet-->>HelloWorld!</greeting>

(3)字符串“--”不能在注釋中出現(xiàn)。例如以下語句是非法的。

<!--ThisisaExample--HelloWorld-->

(4)在XML中,不允許注釋以“>”結(jié)尾,例如以下語句是非法的。

<!--ThisisaExample>

(5)注釋不能嵌套使用,因為第一個“<!--”會匹配在它后面第一次出現(xiàn)的“-->”作為一個完整的注釋符,例如以下情況是非法的。

<!--

外部注釋

<!--內(nèi)部注釋-->

-->

1.2.5特殊字符處理在XML文檔中,有些字符具有特殊的意義,解析器在解析它時不會將其當作一般字符按照其原始意義進行處理,例如,在XML文檔中,“<JavaWeb詳解>”會被看作是一個元素,而不是一個書名。接下來,通過一個案例來演示這種情況,如例1-3所示。例1-3book.xml

1<?xmlversion="1.0"encoding="gb2312"?>

2<書架>

3<書>

4<書名><JavaWeb詳解></書名>

5<作者>張孝祥</作者>

6<售價>58.00元</售價>

7</書>

8<書>

9<書名>EJB3.0入門經(jīng)典</書名>

10<作者>黎活明</作者>

11<售價>39.00元</售價>

12</書>

13</書架>

用IE9.0以下的瀏覽器打開book.xml文件,結(jié)果如圖1-7所示。圖1-7運行結(jié)果例1-3出現(xiàn)了錯誤,錯誤提示“結(jié)束標記‘書名’與開始標記‘JavaWeb詳解’不匹配”。這是因為在XML文檔被解析時,“<JavaWeb詳解>”被看作是一個開始標記,而元素的開始標記必須和結(jié)束標記成對出現(xiàn),所以,當瀏覽器找不到</JavaWeb詳解>結(jié)束標記時,就會報告如圖1-7所示的錯誤。為了解決如圖1-7所示的問題,XML針對這些特殊字符提供了對應的轉(zhuǎn)義字符。在XML文檔中,表示這些特殊字符的轉(zhuǎn)義字符序列稱為預定義實體。表1-1列舉了XML文檔中的特殊字符和預定義實體的對應關系,具體如下。表1-1特殊字符和預定義實體的對照表表1-1中,列舉了預定義實體在XML文檔中的替代字符,接下來對例1-3進行修改,將“<JavaWeb詳解>”中的“<”字符修改成“<”“>”字符修改成“>”,注意“<”和“>”中的分號不能省略,修改后的book.xml文件如例1-4所示。例1-4book.xml

1<?xmlversion="1.0"encoding="gb2312"?>

2<書架>

3<書>

4<書名><JavaWeb詳解></書名>

5<作者>張孝祥</作者>

6<售價>58.00元</售價>

7</書>

8<書>

9<書名>EJB3.0入門經(jīng)典</書名>

10<作者>黎活明</作者>

11<售價>39.00元</售價>

12</書>

13</書架>

保存文檔后,再次用瀏覽器打開,這時瀏覽器中顯示了正確的“<”和“>”字符,如圖1-8所示。圖1-8運行結(jié)果1.2.6CDATA區(qū)通過1.2.5節(jié)的學習,了解到XML文檔中的特殊字符在解析時,可以通過轉(zhuǎn)義字符的方式來處理。但是,當一個XML文檔中包含一段Java代碼,代碼中存在多個小于號(<)、大于號(>)、雙引號(")、單引號(')和單與號(&)這些特殊字符時,如果逐個字符去轉(zhuǎn)換,顯然是非常麻煩的,這時,可以將這段代碼放在CDATA區(qū)中。CDATA是CharacterData的簡寫,即字符數(shù)據(jù),CDATA區(qū)指的是不想被程序解析的一段原始數(shù)據(jù),它以“<![CDATA[”開始,以“]]>”結(jié)束,接下來通過一個案例來演示如何將一段Java程序存放在CDATA區(qū),如例1-5所示。例1-5java.xml

1<?xmlversion="1.0"?>

2<java>

3<![CDATA[

4if(a>b&&c<b)

5max=a;

6]]>

7</java>

用IE5.0以上的瀏覽器打開java.xml文件,結(jié)果如圖1-9所示。圖1-9運行結(jié)果從運行結(jié)果可以看出,CDATA區(qū)中的數(shù)據(jù)被解析器忽略,全部以原始的形式顯示在瀏覽器上。需要注意的是,在使用CDATA區(qū)時,其中的“<![CDATA[”不能寫成“<![cdata[”或“<![Cdata[”。另外,CDATA區(qū)內(nèi)部不能出現(xiàn)字符串“]]>”,因為它代表了CDATA區(qū)的結(jié)束標志。1.3DTD約束1.3.1什么是約束在現(xiàn)實生活中,如果一篇文章的語法正確,但內(nèi)容包含違法言論或邏輯錯誤,這樣的文章是不允許發(fā)表的。同樣,在書寫XML文檔時,其內(nèi)容必須滿足某些條件的限制,先來看一個例子,具體如下:

<?xmlversion="1.0"encoding="gb2312"?>

<書架>

<書>

<書名>Java就業(yè)培訓教程</書名>

<作者姓名="張孝祥"/>

<售價單位="元">38</售價>

<售價單位="元">28</售價>

</書>

</書架>

在上面的示例中,盡管這個XML文檔結(jié)構(gòu)是正確的,用IE瀏覽器打開它也不會出現(xiàn)任何問題,但是,由于XML文檔中的標記是可以隨意定義的,同一本書出現(xiàn)了兩種售價,如果僅根據(jù)標記名稱區(qū)分哪個是原價,哪個是會員價,這是很難實現(xiàn)的。為此,在XML文檔中,定義了一套規(guī)則來對文檔中的內(nèi)容進行約束,這套約束稱為XML約束。對XML文檔進行約束時,同樣需要遵守一定的語法規(guī)則,這種語法規(guī)則就形成了XML約束語言。目前,最常用的兩種約束語言是DTD約束和Schema約束,接下來,在后面的章節(jié)中將針對這兩種約束進行詳細的講解。1.3.2DTD約束DTD約束是早期出現(xiàn)的一種XML約束模式語言,根據(jù)它的語法創(chuàng)建的文件稱為DTD文件。在一個DTD文件中,可以包含元素的定義、元素之間關系的定義、元素屬性的定義以及實體和符號的定義。接下來通過一個案例來簡單認識一下DTD約束,如例1-6和例1-7所示。例1-6book.xml

1<?xmlversion="1.0"encoding="gb2312"?>

2<書架>

3<書>

4<書名>Java就業(yè)培訓教程</書名>

5<作者>張孝祥</作者>

6<售價>58.00元</售價>

7</書>

8<書>

9<書名>EJB3.0入門經(jīng)典</書名>

10<作者>黎活明</作者>

11<售價>39.00元</售價>

12</書>

13</書架>

例1-7book.dtd

1<!ELEMENT書架(書+)>

2<!ELEMENT書(書名,作者,售價)>

3<!ELEMENT書名(#PCDATA)>

4<!ELEMENT作者(#PCDATA)>

5<!ELEMENT售價(#PCDATA)>

例1-7所示的book.dtd是一個簡單的DTD約束文檔。在例1-6中,book.xml中定義的每個元素都是按照book.dtd文檔所規(guī)定的約束進行編寫的。接下來針對例1-7所示的約束文檔進行詳細的講解,具體如下。(1)在第1行中,使用<!ELEMENT…>語句定義了一個元素,其中“書架”是元素的名稱,“(書+)”表示書架元素中有一個或者多個書元素,字符+用來表示它所修飾的成分必須出現(xiàn)一次或者多次。(2)在第2行中,“書”是元素名稱,“(書名,作者,售價)”表示元素書包含書名、作者、售價這三個子元素,并且這些子元素要按照順序依次出現(xiàn)。(3)在第3~5行中,“書名”、“作者”和“售價”都是元素名稱,“(#PCDATA)”表示元素中嵌套的內(nèi)容是普通的文本字符串。對DTD文件有了大致了解后,如果想使用DTD文件約束XML文檔,必須在XML文檔中引入DTD文件。在XML文檔中引入外部DTD文件有兩種方式,具體如下:

1<!DOCTYPE根元素名稱SYSTEM"外部DTD文件的URI">

2<!DOCTYPE根元素名稱PUBLIC"DTD名稱""外部DTD文件的URI">

在上述兩種引入DTD文件的方式中,第一種方式用來引用本地的DTD文件,第二種方式用來引用公共的DTD文件,其中“外部DTD文件的URI”指的是DTD文件的存放位置,對于第一種方式,它可以是相對于XML文檔的相對路徑,也可以是一個絕對路徑,而對于第二種方式,它是Internet上的一個絕對URL地址。接下來對例1-6進行修改,在XML文檔中引入本地的DTD文件book.dtd,如例1-8所示。例1-8book.xml

1<?xmlversion="1.0"encoding="gb2312"?>

2<!DOCTYPE書架SYSTEM"book.dtd">

3<書架>

4<書>

5<書名>Java就業(yè)培訓教程</書名>

6<作者>張孝祥</作者>

7<售價>58.00元</售價>

8</書>

9<書>

10<書名>EJB3.0入門經(jīng)典</書名>

11<作者>黎活明</作者>

12<售價>39.00元</售價>

13</書>

14</書架>

在例1-8中,由于引入的是本地的DTD文件,因此,使用的是SYSTEM屬性的DOCTYPE聲明語句。另外,在XML文檔的聲明語句中,standalone屬性不能設置為“yes”。如果希望引入一個公共的DTD文件,則需要在DOCTYPE聲明語句中使用PUBLIC屬性,具體示例如下:

<!DOCTYPEweb-appPUBLIC

"-//SunMicrosystems,Inc.//DTDWebApplication2.3//EN"

"/dtd/web-app_2_3.dtd">

其中,"-//SunMicrosystems,Inc.//DTDWebApplication2.3//EN"是DTD名稱,它用于說明DTD符合的標準、所有者的名稱以及對DTD描述的文件進行說明,雖然DTD名稱看上去比較復雜,但這完全是由DTD文件發(fā)布者去考慮的事情,XML文件的編寫者只要把DTD文件發(fā)布者事先定義好的DTD標識名稱進行復制就可以了。DTD對XML文檔的約束,除了外部引入方式實現(xiàn)外,還可以采用內(nèi)嵌的方式。在XML中直接嵌入DTD定義語句的完整語法格式如下所示:

<?xmlversion="1.0"encoding="gb2312"standalone="yes"?>

<!DOCTYPE根元素名[

DTD定義語句

]>

接下來對例1-8進行修改,在book.xml文檔中直接嵌入book.dtd文件,修改后的代碼如例1-9所示。例1-9book.xml

1<?xmlversion="1.0"encoding="gb2312"standalone="yes"?>

2<!DOCTYPE書架[

3<!ELEMENT書架(書+)>

4<!ELEMENT書(書名,作者,售價)>

5<!ELEMENT書名(#PCDATA)>

6<!ELEMENT作者(#PCDATA)>

7<!ELEMENT售價(#PCDATA)>

8]>

9<書架>

10<書>

11<書名>Java就業(yè)培訓教程</書名>

12<作者>張孝祥</作者>

13<售價>58.00元</售價>

14</書>

15<書>

16<書名>EJB3.0入門經(jīng)典</書名>

17<作者>黎活明</作者>

18<售價>39.00元</售價>

19</書>

20</書架>

例1-9實現(xiàn)了在XML文檔內(nèi)部直接嵌入DTD語句。需要注意的是,由于一個DTD文件可能會被多個XML文件引用,因此,為了避免在每個XML文檔中都添加一段相同的DTD定義語句,通常都將其放在一個單獨的DTD文檔中定義,采用外部引用的方式對XML文檔進行約束。這樣,不僅便于管理和維護DTD定義,還可以使多個XML文檔共享一個DTD文件。1.3.3DTD語法在編寫XML文檔時,需要掌握XML語法。同理,在編寫DTD文檔時,也需要遵循一定的語法。DTD的結(jié)構(gòu)一般由元素類型定義、屬性定義、實體定義、記號定義等構(gòu)成,一個典型的文檔類型定義會把將來要創(chuàng)建的XML文檔的元素結(jié)構(gòu)、屬性類型、實體引用等預先進行定義。接下來,針對DTD結(jié)構(gòu)中所涉及的語法進行詳細講解。1.元素定義元素是XML文檔的基本組成部分,在DTD定義中,每一條<!ELEMENT…>語句用于定義一個元素,其基本的語法格式如下所示:

<!ELEMENT元素名稱元素內(nèi)容>

在上面元素的定義格式中,包含“元素名稱”和“元素內(nèi)容”。其中,“元素名稱”是自定義的名稱,它用于定義被約束XML文檔中的元素,“元素內(nèi)容”是對元素包含內(nèi)容的聲明,包括數(shù)據(jù)類型和符號兩部分,它共有5種內(nèi)容形式,具體如下。(1)#PCDATA:表示元素中嵌套的內(nèi)容是普通文本字符串,其中關鍵字PCDATA是ParsedCharacterData的簡寫。例如,<!ELEMENT書名(#PCDATA)>表示書名所嵌套的內(nèi)容是字符串類型。(2)子元素:說明元素包含的元素。通常用一對圓括號()將元素中要嵌套的一組子元素括起來,例如,<!ELEMENT書(書名,作者,售價)>表示元素書中要嵌套書名、作者、售價等子元素。(3)混合內(nèi)容:表示元素既可以包含字符數(shù)據(jù),也可以包含子元素?;旌蟽?nèi)容必須被定義零個或多個,例如,<!ELEMENT書(#PCDATA|書名)*>表示書中嵌套的子元素書名包含零個或多個,并且書名是字符串文本格式。(4)EMPTY:表示該元素既不包含字符數(shù)據(jù),也不包含子元素,是一個空元素。如果在文檔中元素本身已經(jīng)表明了明確的含義,就可以在DTD中用關鍵字EMPTY表明空元素。例如,<!ELEMENTbrEMPTY>,其中br是一個沒有內(nèi)容的空元素。(5)ANY:表示該元素可以包含任何的字符數(shù)據(jù)和子元素。例如,<!ELEMENT聯(lián)系人ANY>表示聯(lián)系人可以包含任何形式的內(nèi)容。但在實際開發(fā)中,應該盡量避免使用ANY,因為除了根元素外,其他使用ANY的元素都將失去DTD對XML文檔的約束效果。需要注意的是,在定義元素時,元素內(nèi)容中可以包含一些符號,不同的符號具有不同的作用,下面介紹一些常見的符號。(1)問號[?]:表示該對象可以出現(xiàn)0次或1次。(2)星號[*]:表示該對象可以出現(xiàn)0次或多次。(3)加號[+]:表示該對象可以出現(xiàn)1次或多次。(4)豎線[|]:表示在列出的對象中選擇1個。(5)逗號[,]:表示對象必須按照指定的順序出現(xiàn)。(6)括號[()]:用于給元素進行分組。2.屬性定義在DTD文檔中,定義元素的同時,還可以為元素定義屬性。DTD屬性定義的基本語法格式如下所示:

<!ATTLIST元素名

屬性名1屬性類型設置說明

屬性名2屬性類型設置說明

>

在上面屬性定義的語法格式中,“元素名”是屬性所屬元素的名字,“屬性名”是屬性的名稱,“屬性類型”則是用來指定該屬性是屬于哪種類型,“設置說明”用來說明該屬性是否必須出現(xiàn)。關于“屬性類型”和“設置說明”的相關講解,具體如下。1)設置說明定義元素的屬性時,有4種設置說明可以選擇,具體如下。(1)#REQUIRED#REQUIRED表示元素的該屬性是必需的,例如,當定義聯(lián)系人信息的DTD時,我們希望每一個聯(lián)系人都有一個聯(lián)系電話屬性,這時,可以在屬性聲明時,使用REQUIRED。(2)#IMPLIED#IMPLIED表示元素可以包含該屬性,也可以不包含該屬性。例如,當定義一本書的信息時,發(fā)現(xiàn)書的頁數(shù)屬性對讀者無關緊要,這時,在屬性聲明時,可以使用IMPLIED。(3)#FIXED#FIXED表示一個固定的屬性默認值,在XML文檔中不能將該屬性設置為其他值。使用#FIXED關鍵字時,還需要為該屬性提供一個默認值。當XML文檔中沒有定義該屬性時,其值將被自動設置為DTD中定義的默認值。(4)默認值和FIXED一樣,如果元素不包含該屬性,該屬性將被自動設置為DTD中定義的默認值。不同的是,該屬性的值是可以改變的,如果XML文件中設置了該屬性,新的屬性值會覆蓋DTD中定義的默認值。2)屬性類型在DTD中定義元素的屬性時,有10種屬性類型可以選擇,具體如下。(1)CDATA這是最常用的一種屬性類型,表明屬性類型是字符數(shù)據(jù),與元素內(nèi)容說明中的#PCDATA相同。當然,在屬性設置值中出現(xiàn)的特殊字符,也需要使用其轉(zhuǎn)義字符序列來表示,例如,用&表示字符(&),用<表示字符(<)等。(2)Enumerated在聲明屬性時,可以限制屬性的取值只能從一個列表中選擇,這類屬性屬于Enumerated(枚舉類型)。需要注意的是,在DTD定義中并不會出現(xiàn)關鍵字Enumerated。接下來通過一個案例來學習如何定義Enumerated類型的屬性,如例1-10所示。例1-10enum.xml

1<?xmlversion="1.0"encoding="GB2312"standalone="yes"?>

2<!DOCTYPE購物籃[

3<!ELEMENT購物籃ANY>

4<!ELEMENT肉EMPTY>

5<!ATTLIST肉品種(雞肉|牛肉|豬肉|魚肉)"雞肉">

6]>

7<購物籃>

8<肉品種="魚肉"/>

9<肉品種="牛肉"/>

10<肉/>

11</購物籃>

在例1-10中,“品種”屬性的類型是Enumerated,其值只能為“雞肉”、“牛肉”、“豬肉”和“魚肉”,而不能使用其他值?!捌贩N”屬性的默認值是“雞肉”,所以,即使<購物籃>元素中的第三個子元素沒有顯式定義“品種”這個屬性,但它實際上也具有“品種”這個屬性,且屬性的取值為“雞肉”。(3)ID一個ID類型的屬性用于唯一標識XML文檔中的一個元素。其屬性值必須遵守XML名稱定義的規(guī)則。一個元素只能有一個ID類型的屬性,而且ID類型的屬性必須設置為#IMPLIED或#REQUIRED。因為ID類型屬性的每一個取值都是用來標識一個特定的元素,所以,為ID類型的屬性提供默認值,特別是固定的默認值是毫無意義的。接下來通過一個案例來學習如何定義一個ID類型的屬性,如例1-11所示。例1-11id.xml

1<?xmlversion="1.0"encoding="GB2312"standalone="yes"?>

2<!DOCTYPE聯(lián)系人列表[

3<!ELEMENT聯(lián)系人列表ANY>

4<!ELEMENT聯(lián)系人(姓名,EMAIL)>

5<!ELEMENT姓名(#PCDATA)>

6<!ELEMENTEMAIL(#PCDATA)>

7<!ATTLIST聯(lián)系人編號ID#REQUIRED>

8]>

9<聯(lián)系人列表>

10<聯(lián)系人編號="id1">

11<姓名>張三</姓名>

12<EMAIL>zhang@</EMAIL>

13</聯(lián)系人>

14<聯(lián)系人編號="id2">

15<姓名>李四</姓名>

16<EMAIL>li@</EMAIL>

17</聯(lián)系人>

18</聯(lián)系人列表>

在例1-11中,將元素為<聯(lián)系人>的編號屬性設置為#REQUIRED,說明每個聯(lián)系人都有一個編號,同時,屬性編號的類型為ID,說明編號是唯一的。如此一來,通過編號就可以找到唯一對應的聯(lián)系人了。(4)IDREF和IDREFS例1-11中,雖然張三和李四兩個聯(lián)系人的ID編號是唯一的,但是這兩個ID類型的屬性沒有發(fā)揮作用,這時可以使用IDREF類型,使這兩個聯(lián)系人之間建立一種一對一的關系。接下來通過一個案例來學習IDREF類型的使用,如例1-12所示。例1-12idref.xml

1<?xmlversion="1.0"encoding="GB2312"standalone="yes"?>

2<!DOCTYPE聯(lián)系人列表[

3<!ELEMENT聯(lián)系人列表ANY>

4<!ELEMENT聯(lián)系人(姓名,EMAIL)>

5<!ELEMENT姓名(#PCDATA)>

6<!ELEMENTEMAIL(#PCDATA)>

7<!ATTLIST聯(lián)系人

8編號ID#REQUIRED

9上司IDREF#IMPLIED>

10]>

11<聯(lián)系人列表>

12<聯(lián)系人編號="id1">

13<姓名>張三</姓名>

14<EMAIL>zhang@</EMAIL>

15</聯(lián)系人>

16<聯(lián)系人編號="id2"上司="id1">

17<姓名>李四</姓名>

18<EMAIL>li@</EMAIL>

19</聯(lián)系人>

20</聯(lián)系人列表>

在例1-12中,為元素<聯(lián)系人列表>的子元素<聯(lián)系人>增加了一個名稱為“上司”的屬性,并且將該屬性的類型設置為IDREF,IDREF類型屬性的值必須為一個已經(jīng)存在的ID類型的屬性值。在第二個<聯(lián)系人>元素中,將“上司”屬性設置為第一個聯(lián)系人的編號屬性值,如此一來,就形成了兩個聯(lián)系人元素之間的對應關系,即李四的上司為張三。IDREF類型可以使兩個元素之間建立一對一的關系,但是,如果兩個元素之間的關系是一對多,例如,一個學生去圖書館可以借多本書,這時,需要使用IDREFS類型來指定某個人借閱了哪些書。需要注意的是,IDREFS類型的屬性可以引用多個ID類型的屬性值,這些ID的屬性值需要用空格分隔。接下來通過一個案例來學習IDREFS的使用,如例1-13所示。例1-13library.xml

1<?xmlversion="1.0"encoding="GB2312"?>

2<!DOCTYPElibrary[

3<!ELEMENTlibarary(books,records)>

4<!ELEMENTbooks(book+)>

5<!ELEMENTbook(title)>

6<!ELEMENTtitle(#PCDATA)>

7<!ELEMENTrecords(item+)>

8<!ELEMENTitem(data,person)>

9<!ELEMENTdata(#PCDATA)>

10<!ELEMENTpersonEMPTY>

11<!ATTLISTbookbookidID#REQUIRED>

12<!ATTLISTpersonnameCDATA#REQUIRED>

13<!ATTLISTpersonborrowedIDREFS#REQUIRED>

14]>

15<library>

16<books>

17<bookbookid="b0101">

18<title>Java就業(yè)培訓教材</title>

19</book>

20<bookbookid="b0102">

21<title>JavaWeb開發(fā)內(nèi)幕</title>

22</book>

23<bookbookid="b0103">

24<title>Java開發(fā)寶典</title>

25</book>

26</books>

27<records>

28<item>

29<data>2013-03-13</data>

30<personname="張三"borrowed="b0101b0103"/>

31</item>

32<item>

33<data>2013-05-23</data>

34<personname="李四"borrowed="b0101b0102b0103"/>

35</item>

36</records>

37</library>

例1-13中,將元素<book>中屬性名為bookid的屬性設置為ID類型,元素<person>中名為borrowed的屬性設置為IDREFS類型。從library.xml文檔中可以看出,張三借閱了《Java就業(yè)培訓教材》和《Java開發(fā)寶典》這兩本書,而李四則借閱了《Java就業(yè)培訓教材》、《JavaWeb開發(fā)內(nèi)幕》和《Java開發(fā)寶典》這三本書。(5)NMTOKEN和NMTOKENSNMTOKEN是NameToken的簡寫,它表示由一個或者多個字母、數(shù)字、句點(.)、連字號(-)或下劃線(_)所組成的一個名稱。NMTOKENS關鍵字表示一種列表類型。一個元素的NMOTOKENS類型的屬性設置值可以是同一個XML文件中的另外多個NMTOKEN類型的屬性的設置值,每個NMTOKEN屬性值之間用空格分隔。具體示例如下:

<!ELEMENT用戶EMPTY>

<!ATTLIST用戶姓名NMTOKEN#REQUIRED>

<!ELEMENT數(shù)據(jù)(#PCDATA)>

<!ATTLIST數(shù)據(jù)授權(quán)用戶NMTOKENS#IMPLIED>

在上面的示例中,元素<用戶>的“姓名”屬性指定為NMTOKEN類型,元素<數(shù)據(jù)>的“授權(quán)用戶”屬性指定為NMTOKENS,與這段DTD定義語句對應的XML具體如下:

<用戶姓名="張三">

<用戶姓名="李四">

<數(shù)據(jù)授權(quán)用戶="張三李四">

這里是一些授權(quán)訪問的數(shù)據(jù)

</數(shù)據(jù)>

(6)NOTATION現(xiàn)實世界中存在很多無法或不易用XML格式組織的數(shù)據(jù),如圖像、聲音、影像等。對于這些數(shù)據(jù),XML應用程序常常并不提供直接的應用支持,但可以通過設置NOTATION類型的屬性來讓一個外部應用程序進行處理。在DTD文件中,NOTATION定義語句分為兩種情況,具體如下:

第一種情況:<!NOTATION符號名SYSTEM"MIME類型">

第二種情況:<!NOTATION符號名SYSTEM"URL路徑名">

在上述定義語句中,第一種情況指定數(shù)據(jù)的MIME類型,第二種情況指定處理程序的URL路徑。當使用NOTATION類型作為屬性的類型時,首先要在DTD中使用<!NOTATION…>語句定義相應的notation,接下來通過一個示例來演示NOTATION屬性的使用,如例1-14所示。例1-14notation.xml

1<?xmlversion="1.0"encoding="GB2312"standalone="yes"?>

2<!DOCTYPE文件[

3<!NOTATIONmpSYSTEM"movPlayer.exe">

4<!NOTATIONgifSYSTEM"Image/gif">

5<!ELEMENT文件ANY>

6<!ELEMENT電影EMPTY>

7<!ATTLIST電影演示設備NOTATION(mp|gif)#REQUIRED>

8]>

9<文件>

10<電影演示設備="mp"/>

11<文件>

在例1-14中,元素<電影>指定了兩種可選的演示設備,一種是movPlayer.exe,另一種是用來繪制GIF圖像的應用程序。(7)ENTITY和ENTITYSENTITY對應的中文意思為實體(關于實體定義的細節(jié),將在后面進行介紹)。當某個屬性的類型設置為ENTITY時,表明其屬性值必須為在DTD中使用<!ENTITY…>語句定義的一個實體的引用。接下來看一段DTD定義的語句,具體如下:

<!ENTITYitcast"傳智播客論壇交流,">

<!ELEMENT電影EMPTY>

<!ATTLIST電影來源ENTITY#REQUIRED>

與這段DTD定義語句對應的XML數(shù)據(jù)片段如下:

<電影來源="&itcast;"/>

需要注意的是,只有引用實體才可以作為ENTITY類型屬性的設置值,參數(shù)實體不能用作ENTITY類型的屬性的設置值。關于參數(shù)實體和引用實體的相關講解,將在實體定義中進行詳細講解。ENTITYS關鍵字用于表示一種列表類型,一個元素的ENTITYS類型的屬性設置值可以是多個實體的引用,每個實體的引用之間用空格分隔,具體示例如下:

<!ENTITYbannerSYSTEM"/images/topword.gif">

<!ENTITYlogoSYSTEM"/images/logo.gif">

<!ATTLISTimagesrcENTITIES#REQUIRED>

根據(jù)上面的DTD語句,如果想通過src屬性引用兩幅圖像,則對應的XML數(shù)據(jù)如下所示:

<imgsrc="logobanner">

3.實體定義有時候需要在多個文檔中調(diào)用同樣的內(nèi)容,例如公司名稱、版權(quán)聲明等,為了避免重復輸入這些內(nèi)容,可以通過<!ENTITY…>語句定義一個表示這些內(nèi)容的實體,然后在各個文檔中引用實體名替代它所表示的內(nèi)容。實體可分為兩種類型,分別是引用實體和參數(shù)實體,接下來,針對這兩種實體類型進行詳細的講解。1)引用實體引用實體的語法定義格式有兩種:

1<!ENTITY實體名稱"實體內(nèi)容">

2<!ENTITY實體名稱SYSTEM"外部XML文檔的URL">

引用實體用于解決XML文檔中內(nèi)容重復的問題,其引用方式為:

&實體名稱;

了解了引用實體的語法格式及其在XML文檔中的引用方式,接下來通過一個案例來學習,如例1-15和例1-16所示。例1-15book.dtd

1<!ENTITYitcast"傳智播客官網(wǎng),">

2<!ELEMENT書架(書+)>

3<!ELEMENT書(書名,作者,售價)>

4<!ELEMENT書名(#PCDATA)>

5<!ELEMENT作者(#PCDATA)>

6<!ELEMENT售價(#PCDATA)>

例1-16book.xml

1<?xmlversion="1.0"encoding="GB2312"?>

2<!DOCTYPE書架SYSTEM"book.dtd">

3<書架>

4<書>

5<書名>Java就業(yè)培訓教程</書名>

6<作者>&itcast;</作者>

7<售價>39.9</售價>

8</書>

9<書>

10<書名>EJB3.0入門經(jīng)典</書名>

11<作者>黎活明</作者>

12<售價>39.00元</售價>

13</書>

14</書架>

用IE9.0以下的瀏覽器打開book.xml文件,瀏覽器顯示的結(jié)果如圖1-10所示。圖1-10運行結(jié)果圖1-10提示的錯誤信息是“文本內(nèi)容中發(fā)現(xiàn)無效字符?!边@是因為book.dtd文件使用的是本地字符集編碼,即GB2312編碼,而DTD文件應該使用UTF-8或者Unicode編碼。需要注意的是,IE9.0以上版本的瀏覽器不會提示錯誤。下面將book.dtd按照UTF-8編碼方式重新保存,保存方式如圖1-11所示。圖1-11選擇編碼保存按照圖1-11的方式完成編碼保存后,用IE瀏覽器重新打開book.xml文件或者單擊圖1-10工具欄中的“刷新”按鈕,瀏覽器顯示的結(jié)果如圖1-12所示。圖1-12運行結(jié)果從圖1-12中可以看出,book.xml文件中的“&itcast;”被顯示成“傳智播客官網(wǎng),”。2)參數(shù)實體參數(shù)實體只能被DTD文件自身使用,它的語法格式為:

<!ENTITY%實體名稱"實體內(nèi)容">

需要注意的是,在聲明參數(shù)實體時,ENTITY、%、實體名和“實體內(nèi)容”之間各有一個空格。引用參數(shù)實體的方式是:

%實體名稱;

了解了參數(shù)實體的語法格式和引用方式,接下來通過一段示例代碼來演示參數(shù)實體的定義,具體如下:

<!ENTITY%TAG_NAME"姓名|EMAIL|電話|地址">

<!ELEMENT個人信息(%TAG_NAME;|生日)>

<!ELEMENT客戶信息(%TAG_NAME;|公司名)>

在上面的示例中,DTD中定義了兩個元素,分別是“個人信息”和“客戶信息”,這兩個元素的定義中都包含“姓名|EMAIL|電話|地址”這一相同的部分,因此,可以將相同的部分定義為一個TAG_NAME的參數(shù)實體,然后將“個人信息”和“客戶信息”這兩個元素的定義規(guī)則中的“姓名|EMAIL|電話|地址”部分替換成對TAG_NAME這個參數(shù)實體的引用即可。參數(shù)實體不僅可以簡化元素中定義的相同內(nèi)容,還可以簡化屬性的定義,具體示例如下:

<!ENTITY%common.attributes

'idID#IMPLIED

accountCDATA#REQUIRED'

>

<!ELEMENTpurchaseOrder(item+,manufacturer)>

<!ELEMENTitem(price,quantity)>

<!ELEMENTmanufacturer(#PCDATA)>

<!ATTLISTpurchaseOrder%common.attributes;>

<!ATTLISTitem%common.attributes;>

<!ATTLISTmanufacturer%common.attributes;>

在上面的示例中,由于多個元素都具有id和account這兩個屬性的相同定義,因此,可以將這兩個屬性的文本內(nèi)容定義為一個名稱為common.attributes的參數(shù)實體。當定義元素的屬性時,通過引用common.attributes這個參數(shù)實體,將該參數(shù)實體轉(zhuǎn)換為id和account這兩個屬性所定義的文本內(nèi)容。值得一提的是,當DTD的元素和屬性定義中要出現(xiàn)大量相同內(nèi)容時,參數(shù)實體是一種非常不錯的選擇。因為如果需要修改DTD中相同的部分,只需要在參數(shù)實體的定義中修改即可。1.4Schema約束1.4.1什么是Schema約束同DTD一樣,XMLSchema也是一種用于定義和描述XML文檔結(jié)構(gòu)與內(nèi)容的模式語言,它的出現(xiàn)克服了DTD的局限性。接下來,通過XMLSchema與DTD的比較,將XMLSchema所具有的一些顯著優(yōu)點進行列舉,具體如下。(1)DTD采用的是非XML語法格式,缺乏對文檔結(jié)構(gòu)、元素、數(shù)據(jù)類型等全面的描述。而XMLSchema采用的是XML語法格式,而且它本身也是一種XML文檔,因此,XMLSchema語法格式比DTD更好理解。(2)XML有非常高的合法性要求,雖然DTD和XMLSchema都用于對XML文檔進行描述,都被用作驗證XML合法性的基礎。但是,DTD本身合法性的驗證必須采用另外一套機制,而XMLSchema則采用與XML文檔相同的合法性驗證機制。(3)XMLSchema對名稱空間支持得非常好,而DTD幾乎不支持名稱空間。(4)DTD支持的數(shù)據(jù)類型非常有限。例如,DTD可以指定元素中必須包含字符文本(PCDATA),但無法指定元素中必須包含非負整數(shù)(nonNegativeInteger),而XMLSchema比XMLDTD支持更多的數(shù)據(jù)類型,包括用戶自定義的數(shù)據(jù)類型。(5)DTD定義約束的能力非常有限,無法對XML實例文檔做出更細致的語義限制,例如,無法很好地指定一個元素中的某個子元素必須出現(xiàn)7~12次;而XMLSchema定義約束的能力非常強大,可以對XML實例文檔做出細致的語義限制。通過上面的比較可以發(fā)現(xiàn),XMLSchema的功能比DTD強大很多,但相應的語法也比DTD復雜很多,接下來看一個簡單的Schema文檔,如例1-17所示。例1-17simple.xsd

1<?xmlversion="1.0"?>

2<xs:schemaxmlns:xs="/2001/XMLSchema">

3<xs:elementname="root"type="xs:string"/>

4</xs:schema>

在例1-17中,第1行是文檔聲明,第2行中以xs:schema作為根元素,表示模式定義的開始。由于根元素xs:schema的屬性都在/2001/XMLSchema名稱空間中,因此,在根元素上必須聲明該名稱空間。1.4.2名稱空間一個XML文檔可以引入多個約束文檔,但是,由于約束文檔中的元素或?qū)傩远际亲远x的,因此,在XML文檔中,極有可能出現(xiàn)代表不同含義的同名元素或?qū)傩?,導致名稱發(fā)生沖突。為此,在XML文檔中,提供了名稱空間,它可以唯一標識一個元素或者屬性。這就好比打車去小營,由于北京有兩個地方叫小營,為了避免司機走錯,我們就會說“去亞運村的小營”或者“去清河的小營”。這時的亞運村或者清河就相當于一個名稱空間。在使用名稱空間時,首先必須聲明名稱空間。名稱空間的聲明就是在XML實例文檔中為某個模式文檔的名稱空間指定一個臨時的簡寫名稱,它通過一系列的保留屬性來聲明,這種屬性的名字必須是以“xmlns”或者以“xmlns:”作為前綴。它與其他任何XML屬性一樣,都可以通過直接或者使用默認的方式給出。名稱空間聲明的語法格式如下所示:

<元素名xmlns:prefixname="URI">

在上述語法格式中,“元素名”指的是在哪一個元素上聲明名稱空間,在這個元素上聲明的名稱空間適用于聲明它的元素和屬性,以及該元素中嵌套的所有元素及其屬性。xmlns:prefixname指的是該元素的屬性名,它所對應的值是一個URI引用,用來標識該名稱空間的名稱。需要注意的是,如果有兩個URI并且其組成的字符完全相同,就可以認為它們標識的是同一個名稱空間。了解了名稱空間的聲明方式,接下來通過一個案例來學習,如例1-18所示。例1-18book.xml

1<?xmlversion="1.0"encoding="UTF-8"?>

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 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

提交評論