版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
JavaWeb程序開發(fā)入門注:因內(nèi)容過(guò)長(zhǎng)上傳受限制,本文檔只顯示部分內(nèi)容,完整版文檔請(qǐng)下載此文檔后留言謝謝。目錄\h第1章XML基礎(chǔ)\h1.1XML概述\h1.1.1W3C組織簡(jiǎn)介\h1.1.2什么是XML\h1.1.3XML與HTML的比較\h1.2XML語(yǔ)法\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語(yǔ)法\h1.4Schema約束\h1.4.1什么是Schema約束\h1.4.2名稱空間\h1.4.3引入Schema文檔\h1.4.4Schema語(yǔ)法\h小結(jié)\h測(cè)一測(cè)\h第2章Tomcat開發(fā)Web站點(diǎn)\h2.1Web開發(fā)的相關(guān)知識(shí)\h2.1.1B/S架構(gòu)和C/S架構(gòu)\h2.1.2通信協(xié)議\h2.1.3Web資源\h2.2安裝Tomcat\h2.2.1Tomcat簡(jiǎn)介\h2.2.2Tomcat的安裝和啟動(dòng)\h2.2.3Tomcat診斷\h2.3發(fā)布Web應(yīng)用\h2.3.1什么是Web應(yīng)用\h2.3.2配置Web應(yīng)用虛擬目錄\h2.3.3配置Web應(yīng)用默認(rèn)頁(yè)面\h2.3.4Tomcat的管理平臺(tái)\h2.4配置虛擬主機(jī)\h2.5Eclipse中配置Tomcat服務(wù)器\h小結(jié)\h測(cè)一測(cè)\h第3章HTTP協(xié)議\h3.1HTTP概述\h3.1.1HTTP介紹\h3.1.2HTTP1.0和HTTP1.1\h3.1.3HTTP消息\h3.2HTTP請(qǐng)求消息\h3.2.1HTTP請(qǐng)求行\(zhòng)h3.2.2HTTP請(qǐng)求消息頭\h3.3HTTP響應(yīng)消息\h3.3.1HTTP響應(yīng)狀態(tài)行\(zhòng)h3.3.2HTTP響應(yīng)消息頭\h3.4HTTP其他頭字段\h3.4.1通用頭字段\h3.4.2實(shí)體頭字段\h小結(jié)\h測(cè)一測(cè)\h第4章Servlet技術(shù)\h4.1Servlet開發(fā)入門\h4.1.1Servlet接口\h4.1.2實(shí)現(xiàn)第一個(gè)Servlet程序\h4.1.3Servlet的生命周期\h4.2Servlet高級(jí)應(yīng)用\h4.2.1HttpServlet\h4.2.2使用Eclipse工具開發(fā)Servlet\h4.2.3Servlet虛擬路徑的映射\h4.3ServletConfig和ServletContext\h4.3.1ServletConfig接口\h4.3.2ServletContext接口\h小結(jié)\h測(cè)一測(cè)\h第5章請(qǐng)求和響應(yīng)\h5.1HttpServletResponse對(duì)象\h5.1.1發(fā)送狀態(tài)碼相關(guān)的方法\h5.1.2發(fā)送響應(yīng)消息頭相關(guān)的方法\h5.1.3發(fā)送響應(yīng)消息體相關(guān)的方法\h5.2HttpServletResponse應(yīng)用\h5.2.1中文輸出亂碼問(wèn)題\h5.2.2網(wǎng)頁(yè)定時(shí)刷新并跳轉(zhuǎn)\h5.2.3禁止瀏覽器緩存頁(yè)面\h5.2.4請(qǐng)求重定向\h5.3HttpServletRequest對(duì)象\h5.3.1獲取請(qǐng)求行信息的相關(guān)方法\h5.3.2獲取請(qǐng)求消息頭的相關(guān)方法\h5.3.3獲取請(qǐng)求消息體的相關(guān)方法\h5.4HttpServletRequest應(yīng)用\h5.4.1獲取請(qǐng)求參數(shù)\h5.4.2請(qǐng)求參數(shù)的中文亂碼問(wèn)題\h5.4.3獲取網(wǎng)絡(luò)連接信息\h5.4.4通過(guò)Request對(duì)象傳遞數(shù)據(jù)\h5.5RequestDispatcher對(duì)象的應(yīng)用\h5.5.1RequestDispatcher接口\h5.5.2請(qǐng)求轉(zhuǎn)發(fā)\h5.5.3請(qǐng)求包含\h小結(jié)\h測(cè)一測(cè)\h第6章會(huì)話及其會(huì)話技術(shù)\h6.1會(huì)話概述\h6.2Cookie對(duì)象\h6.2.1什么是Cookie\h6.2.2CookieAPI\h6.3Cookie案例——顯示用戶上次訪問(wèn)時(shí)間\h6.4Session對(duì)象\h6.4.1什么是Session\h6.4.2HttpSessionAPI\h6.4.3Session超時(shí)管理\h6.5Session案例——實(shí)現(xiàn)購(gòu)物車\h6.5.1需求分析\h6.5.2案例實(shí)現(xiàn)\h6.6Session案例——實(shí)現(xiàn)用戶登錄\h6.6.1需求分析\h6.6.2案例實(shí)現(xiàn)\h小結(jié)\h測(cè)一測(cè)\h第7章JSP技術(shù)\h7.1JSP概述\h7.1.1什么是JSP\h7.1.2JSP運(yùn)行原理\h7.1.3分析JSP所生成的Servlet代碼\h7.2JSP基本語(yǔ)法\h7.2.1JSP模板元素\h7.2.2JSP表達(dá)式\h7.2.3JSP腳本片段\h7.2.4JSP聲明\h7.2.5JSP注釋\h7.3JSP指令\h7.3.1page指令\h7.3.2include指令\h7.4JSP隱式對(duì)象\h7.4.1隱式對(duì)象\h7.4.2out對(duì)象\h7.4.3pageContext對(duì)象\h7.4.4exception對(duì)象\h7.5JSP標(biāo)簽\h7.5.1<jsp:include>標(biāo)簽\h7.5.2<jsp:forward>標(biāo)簽\h小結(jié)\h測(cè)一測(cè)\h第8章JavaBean組件\h8.1初識(shí)JavaBean\h8.1.1什么是JavaBean\h8.1.2訪問(wèn)JavaBean的屬性\h8.2反射\h8.2.1認(rèn)識(shí)Class類\h8.2.2通過(guò)反射創(chuàng)建對(duì)象\h8.2.3通過(guò)反射訪問(wèn)屬性\h8.2.4通過(guò)反射調(diào)用方法\h8.3內(nèi)省\h8.3.1什么是內(nèi)省\h8.3.2修改JavaBean的屬性\h8.3.3讀取JavaBean的屬性\h8.4JSP標(biāo)簽訪問(wèn)JavaBean\h8.4.1<jsp:useBean>標(biāo)簽\h8.4.2<jsp:setProperty>標(biāo)簽\h8.4.3<jsp:getProperty>標(biāo)簽\h8.5BeanUtils工具\(yùn)h8.5.1什么是BeanUtils\h8.5.2案例——BeanUtils工具訪問(wèn)JavaBean的屬性\h小結(jié)\h測(cè)一測(cè)\h第9章JSP開發(fā)模型\h9.1JSP開發(fā)模型\h9.1.1JSPModel\h9.1.2MVC設(shè)計(jì)模式\h9.2JSPModel1案例\h9.3JSPModel2案例\h9.3.1案例分析\h9.3.2案例實(shí)現(xiàn)\h小結(jié)\h測(cè)一測(cè)\h附錄:參看CD鏈接第1章XML基礎(chǔ)學(xué)習(xí)目標(biāo)掌握XML的概念,可以區(qū)分XML與HTML的不同。掌握XML語(yǔ)法,學(xué)會(huì)定義XML。掌握DTD約束,會(huì)使用DTD對(duì)XML文檔進(jìn)行約束。掌握Schema約束,熟練使用Schema對(duì)XML文檔進(jìn)行約束。1.1XML概述在實(shí)際開發(fā)中,由于不同操作系統(tǒng)存儲(chǔ)數(shù)據(jù)的格式不兼容,因此,當(dāng)這些系統(tǒng)在進(jìn)行數(shù)據(jù)傳輸時(shí),勢(shì)必會(huì)變得很困難。為此,W3C組織推出了一種新的數(shù)據(jù)交換標(biāo)準(zhǔn)——XML,它是一種通用的數(shù)據(jù)交換格式,可以使數(shù)據(jù)在各種應(yīng)用程序之間輕松地實(shí)現(xiàn)數(shù)據(jù)的交換。本章的學(xué)習(xí)目的就是為了幫助讀者快速了解和掌握XML,為后面深入學(xué)習(xí)JavaWeb開發(fā)技術(shù)奠定基礎(chǔ)。1.1.1W3C組織簡(jiǎn)介W3C是WorldWideWebConsortium(萬(wàn)維網(wǎng)聯(lián)盟)的縮寫,它是對(duì)網(wǎng)絡(luò)標(biāo)準(zhǔn)定制的一個(gè)非贏利組織,如HTML、XHTML、CSS、XML的標(biāo)準(zhǔn)就是由W3C來(lái)制定的。由于Web標(biāo)準(zhǔn)的制定無(wú)論在影響范圍或投資方面都很重要,因此,它不能夠由任何一家組織單獨(dú)控制。在這種情況下,W3C組織實(shí)現(xiàn)了會(huì)員制度。W3C組織的會(huì)員包括軟件開發(fā)商、內(nèi)容提供商、企業(yè)用戶、通信公司、研究機(jī)構(gòu)、研究實(shí)驗(yàn)室、標(biāo)準(zhǔn)化團(tuán)體以及政府,會(huì)員中包括一些知名IT企業(yè),如IBM、Microsoft、AmericaOnline、Apple、Adobe、Macromedia和SunMicrosystems等。W3C組織制定了一系列標(biāo)準(zhǔn)。由W3C正式發(fā)布的標(biāo)準(zhǔn)稱為W3C推薦標(biāo)準(zhǔn),一項(xiàng)技術(shù)要成為W3C的推薦標(biāo)準(zhǔn),需要經(jīng)過(guò)7個(gè)步驟。1.W3C收到一份提交任何W3C的成員都可以向聯(lián)盟提交希望成為Web標(biāo)準(zhǔn)的某項(xiàng)建議,如果建議的內(nèi)容在W3C的工作范圍之內(nèi),W3C將決定是否要對(duì)此展開工作。2.由W3C發(fā)布一份記錄通常,一項(xiàng)對(duì)W3C的提交會(huì)成為一份記錄,記錄是對(duì)某項(xiàng)建議的描述,它作為一份公共文檔僅供討論使用。記錄的發(fā)布并不代表W3C對(duì)其認(rèn)可。記錄可在任何時(shí)間被更新、替換或者廢棄。記錄的內(nèi)容由提交此記錄的會(huì)員來(lái)編輯,而不是W3C。記錄的發(fā)布也不表明W3C已啟動(dòng)與此記錄相關(guān)的任何工作。3.由W3C創(chuàng)建一個(gè)工作組當(dāng)某項(xiàng)提交建議被W3C認(rèn)可后,一個(gè)工作組就會(huì)成立,其中包括會(huì)員和其他有興趣的團(tuán)體。工作組通常會(huì)定義一個(gè)時(shí)間表,并發(fā)布有關(guān)被提議標(biāo)準(zhǔn)的工作草案。4.由W3C發(fā)布一份工作草案W3C工作草案通常會(huì)被發(fā)布于W3C的網(wǎng)站上,工作草案會(huì)說(shuō)明當(dāng)前工作的進(jìn)展,由于其內(nèi)容可在任何時(shí)間被更新、替換或廢棄,因此它不應(yīng)該被作為工作的參考材料。5.由W3C發(fā)布一份候選的推薦標(biāo)準(zhǔn)當(dāng)某些規(guī)范比較復(fù)雜時(shí),它可能需要會(huì)員和軟件開發(fā)商花費(fèi)更多的經(jīng)費(fèi)、時(shí)間來(lái)測(cè)試。這些規(guī)范可能會(huì)作為候選推薦標(biāo)準(zhǔn)來(lái)發(fā)布。候選推薦標(biāo)準(zhǔn)同工作草案一樣,也是一種“正在進(jìn)行的工作”,同樣不應(yīng)被作為工作的參考材料。因?yàn)榇宋臋n可能在任何時(shí)間被更新、替換或廢棄。6.由W3C發(fā)布一份被提議的推薦標(biāo)準(zhǔn)提議的推薦標(biāo)準(zhǔn)的發(fā)布意味著工作組中工作的最后階段。提議的推薦標(biāo)準(zhǔn)也是一種“正在進(jìn)行的工作”。此文檔可在任何時(shí)間被更新、替換或廢棄。不過(guò),即使它不意味著W3C任何官方的認(rèn)可,在極多的情況下,提議的推薦標(biāo)準(zhǔn)無(wú)論在內(nèi)容還是時(shí)間上都已接近于最后的推薦標(biāo)準(zhǔn)。7.由W3C發(fā)布推薦標(biāo)準(zhǔn)W3C推薦標(biāo)準(zhǔn)已經(jīng)通過(guò)了W3C會(huì)員們的評(píng)審,并得到了W3C主任的正式批準(zhǔn)。W3C推薦標(biāo)準(zhǔn)是一份穩(wěn)定的文檔,可被用作參考材料。1.1.2什么是XML在現(xiàn)實(shí)生活中,很多事物之間都存在著一定的關(guān)聯(lián)關(guān)系,例如中國(guó)有很多省份,每個(gè)省份下又有很多城市。這些省市之間的關(guān)聯(lián)關(guān)系可以通過(guò)一張樹狀結(jié)構(gòu)圖來(lái)描述,具體如圖1-1所示。圖1-1城市關(guān)系圖圖1-1直觀地描述了中國(guó)與所轄省、市之間的層次關(guān)系。但是對(duì)于程序而言,解析圖片內(nèi)容非常困難,這時(shí),采用XML文件保存這種具有樹狀結(jié)構(gòu)的數(shù)據(jù)是最好的選擇。XML是EXtensibleMarkupLanguage的縮寫,它是一種類似于HTML的標(biāo)記語(yǔ)言,稱為可擴(kuò)展標(biāo)記語(yǔ)言。所謂可擴(kuò)展,指的是用戶可以按照XML規(guī)則自定義標(biāo)記。下面通過(guò)一個(gè)XML文檔來(lái)描述如圖1-1所示的關(guān)系,如例1-1所示。例1-1city.xml
1<中國(guó)>
2<河北>
3<城市>張家口</城市>
4<城市>石家莊</城市>
5</河北>
6<山西>
7<城市>太原</城市>
8<城市>大同</城市>
9</山西>
10</中國(guó)>
在例1-1中,<中國(guó)>、<河北>、<城市>都是用戶自己創(chuàng)建的標(biāo)記,它們都可稱為元素,這些元素必須成對(duì)出現(xiàn),即包括開始標(biāo)記和結(jié)束標(biāo)記。例如,在<中國(guó)>元素中的開始標(biāo)記為<中國(guó)>,結(jié)束標(biāo)記為</中國(guó)>。<中國(guó)>被視為整個(gè)XML文檔的根元素,在它下面有兩個(gè)子元素,分別是<河北>和<山西>,在這兩個(gè)子元素中又分別包含兩個(gè)<城市>元素。在XML文檔中,通過(guò)元素的嵌套關(guān)系可以很準(zhǔn)確地描述具有樹狀層次結(jié)構(gòu)的復(fù)雜信息,因此,越來(lái)越多的應(yīng)用程序都采用XML格式來(lái)存放相關(guān)的配置信息,從而便于讀取和修改。1.1.3XML與HTML的比較XML和HTML都是標(biāo)記文本,它們?cè)诮Y(jié)構(gòu)上大致相同,都是以標(biāo)記的形式來(lái)描述信息。但實(shí)際上它們有著本質(zhì)的區(qū)別,為了讓初學(xué)者不產(chǎn)生混淆,接下來(lái)對(duì)HTML和XML進(jìn)行比較,具體如下。(1)HTML中的標(biāo)記是用來(lái)顯示數(shù)據(jù)的,而XML中的標(biāo)記用來(lái)描述數(shù)據(jù)的性質(zhì)和結(jié)構(gòu)。(2)HTML是不區(qū)分大小寫的,而XML是嚴(yán)格區(qū)分大小寫的。(3)HTML可以有多個(gè)根元素,而格式良好的XML有且只能有一個(gè)根元素。(4)HTML中,屬性值的引號(hào)是可用可不用的,而XML中屬性值必須放在引號(hào)中。(5)HTML中,空格是自動(dòng)過(guò)濾的,而XML中空格則不會(huì)自動(dòng)刪除。(6)HTML中的標(biāo)記是預(yù)定義的,而XML中的標(biāo)記是可以隨便定義的,并且可擴(kuò)展。需要注意的是,XML不是HTML的升級(jí),也不是HTML的替代產(chǎn)品,雖然兩者有些相似,但它們的應(yīng)用領(lǐng)域和范圍完全不同。HTML規(guī)范的最終版本是HTML4.01,它已經(jīng)被XHTML取代。而XHTML是HTML和XML的混合物,它完全采用XML的語(yǔ)法規(guī)則來(lái)編寫Web頁(yè)面,有效地結(jié)合了HTML的簡(jiǎn)單性和XML的可擴(kuò)展性,并且XML可以應(yīng)用在金融、科研等各個(gè)領(lǐng)域,而XHTML只是XML在Web領(lǐng)域的一種應(yīng)用。1.2XML語(yǔ)法1.2.1文檔聲明在一個(gè)完整的XML文檔中,必須包含一個(gè)XML文檔的聲明,并且該聲明必須位于文檔的第一行。這個(gè)聲明表示該文檔是一個(gè)XML文檔,以及遵循哪個(gè)XML版本的規(guī)范。XML文檔聲明的語(yǔ)法格式如下所示:
<?xml版本信息[編碼信息][文檔獨(dú)立性信息]?>
從上面的語(yǔ)法格式中可以看出,文檔聲明以符號(hào)“<?”開頭,以符號(hào)“?>”結(jié)束,中間可以聲明版本信息,編碼信息以及文檔獨(dú)立性信息。需要注意的是,在“<”和“?”之間、“?”和“>”之間以及第一個(gè)“?”和“xml”之間不能有空格;另外,中括號(hào)([])括起來(lái)的部分是可選的。接下來(lái),針對(duì)語(yǔ)法格式中的版本信息、編碼信息、文檔獨(dú)立性信息進(jìn)行詳細(xì)講解,具體如下。1.版本聲明由于解析器對(duì)不同版本的XML文檔解析方式不同,因此在文檔聲明時(shí),必須指定版本信息。版本聲明的具體示例如下所示:
<?xmlversion="1.0"?>
在上述版本聲明中,version屬性表示XML的版本。目前,最常用的XML版本是1.0。2.文檔編碼聲明由于人們可以采用不同的字符集編碼來(lái)書寫一個(gè)字符內(nèi)容完全相同的XML文檔,所以,XML軟件工具需要知道XML文檔所使用的編碼方式,這時(shí),可以通過(guò)在XML文檔聲明中指定encoding屬性來(lái)說(shuō)明。默認(rèn)情況下,XML文檔使用的是UTF-8編碼方式。如果要將字符編碼聲明為GB2312,則示例代碼如下所示:
<?xmlversion="1.0"encoding="gb2312"?>
3.獨(dú)立文檔聲明如果我們的文檔不依賴外部文檔,在XML聲明中,可以通過(guò)standalone="yes"來(lái)聲明這個(gè)文檔是獨(dú)立的文檔。如果文檔依賴于外部文檔,可以通過(guò)standalone="no"來(lái)聲明。默認(rèn)情況下,standalone屬性的值為no。一個(gè)完整的XML聲明如下所示:
<?xmlversion="1.0"encoding="gb2312"standalone="yes"?>
上面所提的依賴,是指文檔需要DTD文件驗(yàn)證其中的標(biāo)識(shí)是否有效,或者需要XSL、CSS文件控制顯示外觀等,關(guān)于DTD文件等相關(guān)知識(shí),將在后面的章節(jié)中進(jìn)行詳細(xì)講解。注意:XML聲明必須位于文檔的第一行,前面不能有任何字符。在XML聲明時(shí),如果同時(shí)設(shè)置了encoding和standalone屬性,standalone屬性要位于encoding屬性之后。動(dòng)手體驗(yàn):加深對(duì)encoding屬性的理解對(duì)于含有中文字符的XML文檔,其中的字符需要采用Unicode或GB2312(簡(jiǎn)體中文字符編碼)編碼來(lái)表示;同時(shí),XML文檔中字符使用的編碼方式必須和文檔聲明中的encoding屬性值一致,否則會(huì)發(fā)生中文亂碼問(wèn)題。接下來(lái),通過(guò)一個(gè)案例來(lái)演示encoding屬性的使用,具體步驟如下。(1)用Windows自帶的記事本程序創(chuàng)建一個(gè)名為book.xml的文件,文件內(nèi)容具體如例1-2所示。例1-2book.xml
1<?xmlversion="1.0"?>
2<書架>
3<書>
4<書名>Java就業(yè)培訓(xùn)教程</書名>
5<作者>張孝祥</作者>
6<售價(jià)>58.00元</售價(jià)>
7</書>
8<書>
9<書名>EJB3.0入門經(jīng)典</書名>
10<作者>黎活明</作者>
11<售價(jià)>39.00元</售價(jià)>
12</書>
13</書架>
(2)用IE9.0以下的瀏覽器打開book.xml文件,結(jié)果如圖1-2所示。圖1-2運(yùn)行結(jié)果從圖1-2中可以看出,瀏覽器在解析文檔時(shí)發(fā)生了錯(cuò)誤,錯(cuò)誤提示信息是“文本內(nèi)容中發(fā)現(xiàn)無(wú)效字符”。這是因?yàn)樵赽ook.xml文檔聲明語(yǔ)句中沒(méi)有指定文檔中的字符編碼方式,瀏覽器就會(huì)用默認(rèn)的Unicode編碼來(lái)解析該文檔,而該文檔中的字符實(shí)際上使用的是GB2312編碼,而非Unicode編碼。需要注意的是,由于IE瀏覽器的不斷更新,IE9以上的瀏覽器在解析文檔時(shí)不會(huì)提示錯(cuò)誤。(3)使用記事本程序打開book.xml文件,對(duì)第1行進(jìn)行修改,指定encoding屬性的值為GB2312,具體如下:
<?xmlversion="1.0"encoding="GB2312"?>
保存修改后的內(nèi)容,刷新顯示book.xml文件的瀏覽器窗口,結(jié)果如圖1-3所示。圖1-3運(yùn)行結(jié)果在圖1-3中,單擊某個(gè)標(biāo)簽前面的減號(hào)(-),嵌套在該標(biāo)簽中的所有內(nèi)容將被折疊起來(lái),標(biāo)簽前面的減號(hào)(-)也將變成加號(hào)(+)。單擊某個(gè)標(biāo)簽前面的加號(hào)(+),嵌套在該標(biāo)簽中的所有內(nèi)容將被展開,標(biāo)簽前面的加號(hào)(+)也將變成減號(hào)(-)。(4)切換到記事本程序打開book.xml文件的窗口,連擊“文件”→“另存為”選項(xiàng),在打開的“另存為”對(duì)話框中,選擇“所有文件”及UTF-8,具體如圖1-4所示。圖1-4保存方式在圖1-4中,以UTF-8編碼保存book.xml文件后,盡管在記事本程序窗口中顯示的效果沒(méi)有任何變化,但是book.xml文件內(nèi)部存儲(chǔ)的數(shù)據(jù)已經(jīng)改變,此時(shí)可以通過(guò)比較book.xml文件修改前后的大小來(lái)觀察。刷新顯示book.xml文件的瀏覽器窗口,結(jié)果如圖1-5所示。圖1-5運(yùn)行結(jié)果從圖1-5可以看出發(fā)生了錯(cuò)誤,錯(cuò)誤提示為“不支持從當(dāng)前編碼到指定編碼的切換”。這是因?yàn)楝F(xiàn)在的book.xml文件的字符編碼為UTF-8,而文檔聲明中指定encoding屬性為GB2312,因此,瀏覽器在解析book.xml文件時(shí)會(huì)發(fā)生錯(cuò)誤。(5)將book.xml的文檔聲明的encoding屬性修改為UTF-8,保存后刷新顯示book.xml文件的瀏覽器窗口,顯示的結(jié)果如圖1-6所示。圖1-6運(yùn)行結(jié)果1.2.2元素定義在XML文檔中,主體內(nèi)容都是由元素(Element)組成的。元素一般是由開始標(biāo)記、屬性、元素內(nèi)容和結(jié)束標(biāo)記構(gòu)成,具體示例如下:
<城市>北京</城市>
在上面的示例中,“<城市>”和“</城市>”就是XML文檔中的標(biāo)記,標(biāo)記的名稱也就是元素的名稱。在一個(gè)元素中可以嵌套若干子元素。如果一個(gè)元素沒(méi)有嵌套在其他元素內(nèi),則這個(gè)元素稱為根元素。根元素是XML文檔定義的第一個(gè)元素。如果一個(gè)元素中沒(méi)有嵌套子元素,也沒(méi)有包含文本內(nèi)容,則這樣的元素稱為空元素,空元素可以不使用結(jié)束標(biāo)記,但必須在起始標(biāo)記的“>”前增加一個(gè)正斜杠“/”來(lái)說(shuō)明該元素是個(gè)空元素,例如:<img></img>可以簡(jiǎn)寫成<img/>。在XML文檔中,元素的名稱可以包含字母、數(shù)字以及其他一些可見(jiàn)的字符,但是在命名XML元素時(shí),應(yīng)該遵守以下規(guī)范。(1)區(qū)分大小寫,例如:<P>和<p>是兩個(gè)不同的標(biāo)記。(2)元素名稱中,不能包含空格、冒號(hào)、分號(hào)、逗號(hào)和尖括號(hào)等,元素不能以數(shù)字開頭,否則XML文檔會(huì)報(bào)錯(cuò)。(3)建議不要使用“.”,因?yàn)樵诤芏喑绦蛘Z(yǔ)言中,“.”用于引用對(duì)象的屬性。(4)建議不要用減號(hào)(-),而以下劃線(_)代替,以避免與表達(dá)式中的減號(hào)(-)運(yùn)算符發(fā)生沖突。(5)建議名稱不要以字符組合xml(或XML、或Xml等)開頭。(6)建議名稱的大小寫盡量采用同一標(biāo)準(zhǔn),要么全部大寫,要么全部小寫。(7)名稱可以使用非英文字符,例如中文,但有些軟件可能不支持非英文字符以外的字符,在使用時(shí)應(yīng)考慮這種情況。1.2.3屬性定義在XML文檔中,可以為元素定義屬性。屬性是對(duì)元素的進(jìn)一步描述和說(shuō)明。在一個(gè)元素中,可以有多個(gè)屬性,并且每個(gè)屬性都有自己的名稱和取值,具體示例如下:
<售價(jià)單位="元">68</售價(jià)>
在上面的示例中,<售價(jià)>中定義了一個(gè)屬性“單位”。需要注意的是,在XML文檔中,屬性的命名規(guī)范同元素相同,屬性值必須要用雙引號(hào)("")或者單引號(hào)('')引起來(lái),否則被視為錯(cuò)誤。另外,屬性還可以通過(guò)子元素的形式來(lái)描述同樣的信息,例如,屬性定義的示例代碼可以改寫為以下代碼,具體如下:
<售價(jià)>
<價(jià)格>68</價(jià)格>
<單位>元</單位>
</售價(jià)>
1.2.4注釋如果想在XML文檔中插入一些附加信息,如作者姓名、地址或電話等信息,或者想暫時(shí)屏蔽某些XML語(yǔ)句,這時(shí),可以通過(guò)注釋的方式來(lái)實(shí)現(xiàn),被注釋的內(nèi)容會(huì)被程序忽略而不被解析和處理。XML注釋和HTML注釋寫法基本一致,具體語(yǔ)法格式如下所示:
<!--注釋信息-->
從上述語(yǔ)法格式中可以看出,XML注釋非常簡(jiǎn)單,但是,仍有一些細(xì)節(jié)問(wèn)題需要注意,具體如下。(1)注釋不能出現(xiàn)在XML聲明之前,XML聲明必須是文檔的第一行,例如以下語(yǔ)句是非法的。
<!--address:czbk-->
<!--Date:2013-6-28-->
<?xmlversion="1.0"?>
(2)注釋不能出現(xiàn)在標(biāo)記中,例如以下語(yǔ)句是非法的。
<greeting<!--Begingreet-->>HelloWorld!</greeting>
(3)字符串“--”不能在注釋中出現(xiàn)。例如以下語(yǔ)句是非法的。
<!--ThisisaExample--HelloWorld-->
(4)在XML中,不允許注釋以“>”結(jié)尾,例如以下語(yǔ)句是非法的。
<!--ThisisaExample>
(5)注釋不能嵌套使用,因?yàn)榈谝粋€(gè)“<!--”會(huì)匹配在它后面第一次出現(xiàn)的“-->”作為一個(gè)完整的注釋符,例如以下情況是非法的。
<!--
外部注釋
<!--內(nèi)部注釋-->
-->
1.2.5特殊字符處理在XML文檔中,有些字符具有特殊的意義,解析器在解析它時(shí)不會(huì)將其當(dāng)作一般字符按照其原始意義進(jìn)行處理,例如,在XML文檔中,“<JavaWeb詳解>”會(huì)被看作是一個(gè)元素,而不是一個(gè)書名。接下來(lái),通過(guò)一個(gè)案例來(lái)演示這種情況,如例1-3所示。例1-3book.xml
1<?xmlversion="1.0"encoding="gb2312"?>
2<書架>
3<書>
4<書名><JavaWeb詳解></書名>
5<作者>張孝祥</作者>
6<售價(jià)>58.00元</售價(jià)>
7</書>
8<書>
9<書名>EJB3.0入門經(jīng)典</書名>
10<作者>黎活明</作者>
11<售價(jià)>39.00元</售價(jià)>
12</書>
13</書架>
用IE9.0以下的瀏覽器打開book.xml文件,結(jié)果如圖1-7所示。圖1-7運(yùn)行結(jié)果例1-3出現(xiàn)了錯(cuò)誤,錯(cuò)誤提示“結(jié)束標(biāo)記‘書名’與開始標(biāo)記‘JavaWeb詳解’不匹配”。這是因?yàn)樵赬ML文檔被解析時(shí),“<JavaWeb詳解>”被看作是一個(gè)開始標(biāo)記,而元素的開始標(biāo)記必須和結(jié)束標(biāo)記成對(duì)出現(xiàn),所以,當(dāng)瀏覽器找不到</JavaWeb詳解>結(jié)束標(biāo)記時(shí),就會(huì)報(bào)告如圖1-7所示的錯(cuò)誤。為了解決如圖1-7所示的問(wèn)題,XML針對(duì)這些特殊字符提供了對(duì)應(yīng)的轉(zhuǎn)義字符。在XML文檔中,表示這些特殊字符的轉(zhuǎn)義字符序列稱為預(yù)定義實(shí)體。表1-1列舉了XML文檔中的特殊字符和預(yù)定義實(shí)體的對(duì)應(yīng)關(guān)系,具體如下。表1-1特殊字符和預(yù)定義實(shí)體的對(duì)照表表1-1中,列舉了預(yù)定義實(shí)體在XML文檔中的替代字符,接下來(lái)對(duì)例1-3進(jìn)行修改,將“<JavaWeb詳解>”中的“<”字符修改成“<”“>”字符修改成“>”,注意“<”和“>”中的分號(hào)不能省略,修改后的book.xml文件如例1-4所示。例1-4book.xml
1<?xmlversion="1.0"encoding="gb2312"?>
2<書架>
3<書>
4<書名><JavaWeb詳解></書名>
5<作者>張孝祥</作者>
6<售價(jià)>58.00元</售價(jià)>
7</書>
8<書>
9<書名>EJB3.0入門經(jīng)典</書名>
10<作者>黎活明</作者>
11<售價(jià)>39.00元</售價(jià)>
12</書>
13</書架>
保存文檔后,再次用瀏覽器打開,這時(shí)瀏覽器中顯示了正確的“<”和“>”字符,如圖1-8所示。圖1-8運(yùn)行結(jié)果1.2.6CDATA區(qū)通過(guò)1.2.5節(jié)的學(xué)習(xí),了解到XML文檔中的特殊字符在解析時(shí),可以通過(guò)轉(zhuǎn)義字符的方式來(lái)處理。但是,當(dāng)一個(gè)XML文檔中包含一段Java代碼,代碼中存在多個(gè)小于號(hào)(<)、大于號(hào)(>)、雙引號(hào)(")、單引號(hào)(')和單與號(hào)(&)這些特殊字符時(shí),如果逐個(gè)字符去轉(zhuǎn)換,顯然是非常麻煩的,這時(shí),可以將這段代碼放在CDATA區(qū)中。CDATA是CharacterData的簡(jiǎn)寫,即字符數(shù)據(jù),CDATA區(qū)指的是不想被程序解析的一段原始數(shù)據(jù),它以“<![CDATA[”開始,以“]]>”結(jié)束,接下來(lái)通過(guò)一個(gè)案例來(lái)演示如何將一段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運(yùn)行結(jié)果從運(yùn)行結(jié)果可以看出,CDATA區(qū)中的數(shù)據(jù)被解析器忽略,全部以原始的形式顯示在瀏覽器上。需要注意的是,在使用CDATA區(qū)時(shí),其中的“<![CDATA[”不能寫成“<![cdata[”或“<![Cdata[”。另外,CDATA區(qū)內(nèi)部不能出現(xiàn)字符串“]]>”,因?yàn)樗砹薈DATA區(qū)的結(jié)束標(biāo)志。1.3DTD約束1.3.1什么是約束在現(xiàn)實(shí)生活中,如果一篇文章的語(yǔ)法正確,但內(nèi)容包含違法言論或邏輯錯(cuò)誤,這樣的文章是不允許發(fā)表的。同樣,在書寫XML文檔時(shí),其內(nèi)容必須滿足某些條件的限制,先來(lái)看一個(gè)例子,具體如下:
<?xmlversion="1.0"encoding="gb2312"?>
<書架>
<書>
<書名>Java就業(yè)培訓(xùn)教程</書名>
<作者姓名="張孝祥"/>
<售價(jià)單位="元">38</售價(jià)>
<售價(jià)單位="元">28</售價(jià)>
</書>
</書架>
在上面的示例中,盡管這個(gè)XML文檔結(jié)構(gòu)是正確的,用IE瀏覽器打開它也不會(huì)出現(xiàn)任何問(wèn)題,但是,由于XML文檔中的標(biāo)記是可以隨意定義的,同一本書出現(xiàn)了兩種售價(jià),如果僅根據(jù)標(biāo)記名稱區(qū)分哪個(gè)是原價(jià),哪個(gè)是會(huì)員價(jià),這是很難實(shí)現(xiàn)的。為此,在XML文檔中,定義了一套規(guī)則來(lái)對(duì)文檔中的內(nèi)容進(jìn)行約束,這套約束稱為XML約束。對(duì)XML文檔進(jìn)行約束時(shí),同樣需要遵守一定的語(yǔ)法規(guī)則,這種語(yǔ)法規(guī)則就形成了XML約束語(yǔ)言。目前,最常用的兩種約束語(yǔ)言是DTD約束和Schema約束,接下來(lái),在后面的章節(jié)中將針對(duì)這兩種約束進(jìn)行詳細(xì)的講解。1.3.2DTD約束DTD約束是早期出現(xiàn)的一種XML約束模式語(yǔ)言,根據(jù)它的語(yǔ)法創(chuàng)建的文件稱為DTD文件。在一個(gè)DTD文件中,可以包含元素的定義、元素之間關(guān)系的定義、元素屬性的定義以及實(shí)體和符號(hào)的定義。接下來(lái)通過(guò)一個(gè)案例來(lái)簡(jiǎn)單認(rèn)識(shí)一下DTD約束,如例1-6和例1-7所示。例1-6book.xml
1<?xmlversion="1.0"encoding="gb2312"?>
2<書架>
3<書>
4<書名>Java就業(yè)培訓(xùn)教程</書名>
5<作者>張孝祥</作者>
6<售價(jià)>58.00元</售價(jià)>
7</書>
8<書>
9<書名>EJB3.0入門經(jīng)典</書名>
10<作者>黎活明</作者>
11<售價(jià)>39.00元</售價(jià)>
12</書>
13</書架>
例1-7book.dtd
1<!ELEMENT書架(書+)>
2<!ELEMENT書(書名,作者,售價(jià))>
3<!ELEMENT書名(#PCDATA)>
4<!ELEMENT作者(#PCDATA)>
5<!ELEMENT售價(jià)(#PCDATA)>
例1-7所示的book.dtd是一個(gè)簡(jiǎn)單的DTD約束文檔。在例1-6中,book.xml中定義的每個(gè)元素都是按照book.dtd文檔所規(guī)定的約束進(jìn)行編寫的。接下來(lái)針對(duì)例1-7所示的約束文檔進(jìn)行詳細(xì)的講解,具體如下。(1)在第1行中,使用<!ELEMENT…>語(yǔ)句定義了一個(gè)元素,其中“書架”是元素的名稱,“(書+)”表示書架元素中有一個(gè)或者多個(gè)書元素,字符+用來(lái)表示它所修飾的成分必須出現(xiàn)一次或者多次。(2)在第2行中,“書”是元素名稱,“(書名,作者,售價(jià))”表示元素書包含書名、作者、售價(jià)這三個(gè)子元素,并且這些子元素要按照順序依次出現(xiàn)。(3)在第3~5行中,“書名”、“作者”和“售價(jià)”都是元素名稱,“(#PCDATA)”表示元素中嵌套的內(nèi)容是普通的文本字符串。對(duì)DTD文件有了大致了解后,如果想使用DTD文件約束XML文檔,必須在XML文檔中引入DTD文件。在XML文檔中引入外部DTD文件有兩種方式,具體如下:
1<!DOCTYPE根元素名稱SYSTEM"外部DTD文件的URI">
2<!DOCTYPE根元素名稱PUBLIC"DTD名稱""外部DTD文件的URI">
在上述兩種引入DTD文件的方式中,第一種方式用來(lái)引用本地的DTD文件,第二種方式用來(lái)引用公共的DTD文件,其中“外部DTD文件的URI”指的是DTD文件的存放位置,對(duì)于第一種方式,它可以是相對(duì)于XML文檔的相對(duì)路徑,也可以是一個(gè)絕對(duì)路徑,而對(duì)于第二種方式,它是Internet上的一個(gè)絕對(duì)URL地址。接下來(lái)對(duì)例1-6進(jìn)行修改,在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è)培訓(xùn)教程</書名>
6<作者>張孝祥</作者>
7<售價(jià)>58.00元</售價(jià)>
8</書>
9<書>
10<書名>EJB3.0入門經(jīng)典</書名>
11<作者>黎活明</作者>
12<售價(jià)>39.00元</售價(jià)>
13</書>
14</書架>
在例1-8中,由于引入的是本地的DTD文件,因此,使用的是SYSTEM屬性的DOCTYPE聲明語(yǔ)句。另外,在XML文檔的聲明語(yǔ)句中,standalone屬性不能設(shè)置為“yes”。如果希望引入一個(gè)公共的DTD文件,則需要在DOCTYPE聲明語(yǔ)句中使用PUBLIC屬性,具體示例如下:
<!DOCTYPEweb-appPUBLIC
"-//SunMicrosystems,Inc.//DTDWebApplication2.3//EN"
"/dtd/web-app_2_3.dtd">
其中,"-//SunMicrosystems,Inc.//DTDWebApplication2.3//EN"是DTD名稱,它用于說(shuō)明DTD符合的標(biāo)準(zhǔn)、所有者的名稱以及對(duì)DTD描述的文件進(jìn)行說(shuō)明,雖然DTD名稱看上去比較復(fù)雜,但這完全是由DTD文件發(fā)布者去考慮的事情,XML文件的編寫者只要把DTD文件發(fā)布者事先定義好的DTD標(biāo)識(shí)名稱進(jìn)行復(fù)制就可以了。DTD對(duì)XML文檔的約束,除了外部引入方式實(shí)現(xiàn)外,還可以采用內(nèi)嵌的方式。在XML中直接嵌入DTD定義語(yǔ)句的完整語(yǔ)法格式如下所示:
<?xmlversion="1.0"encoding="gb2312"standalone="yes"?>
<!DOCTYPE根元素名[
DTD定義語(yǔ)句
]>
接下來(lái)對(duì)例1-8進(jìn)行修改,在book.xml文檔中直接嵌入book.dtd文件,修改后的代碼如例1-9所示。例1-9book.xml
1<?xmlversion="1.0"encoding="gb2312"standalone="yes"?>
2<!DOCTYPE書架[
3<!ELEMENT書架(書+)>
4<!ELEMENT書(書名,作者,售價(jià))>
5<!ELEMENT書名(#PCDATA)>
6<!ELEMENT作者(#PCDATA)>
7<!ELEMENT售價(jià)(#PCDATA)>
8]>
9<書架>
10<書>
11<書名>Java就業(yè)培訓(xùn)教程</書名>
12<作者>張孝祥</作者>
13<售價(jià)>58.00元</售價(jià)>
14</書>
15<書>
16<書名>EJB3.0入門經(jīng)典</書名>
17<作者>黎活明</作者>
18<售價(jià)>39.00元</售價(jià)>
19</書>
20</書架>
例1-9實(shí)現(xiàn)了在XML文檔內(nèi)部直接嵌入DTD語(yǔ)句。需要注意的是,由于一個(gè)DTD文件可能會(huì)被多個(gè)XML文件引用,因此,為了避免在每個(gè)XML文檔中都添加一段相同的DTD定義語(yǔ)句,通常都將其放在一個(gè)單獨(dú)的DTD文檔中定義,采用外部引用的方式對(duì)XML文檔進(jìn)行約束。這樣,不僅便于管理和維護(hù)DTD定義,還可以使多個(gè)XML文檔共享一個(gè)DTD文件。1.3.3DTD語(yǔ)法在編寫XML文檔時(shí),需要掌握XML語(yǔ)法。同理,在編寫DTD文檔時(shí),也需要遵循一定的語(yǔ)法。DTD的結(jié)構(gòu)一般由元素類型定義、屬性定義、實(shí)體定義、記號(hào)定義等構(gòu)成,一個(gè)典型的文檔類型定義會(huì)把將來(lái)要?jiǎng)?chuàng)建的XML文檔的元素結(jié)構(gòu)、屬性類型、實(shí)體引用等預(yù)先進(jìn)行定義。接下來(lái),針對(duì)DTD結(jié)構(gòu)中所涉及的語(yǔ)法進(jìn)行詳細(xì)講解。1.元素定義元素是XML文檔的基本組成部分,在DTD定義中,每一條<!ELEMENT…>語(yǔ)句用于定義一個(gè)元素,其基本的語(yǔ)法格式如下所示:
<!ELEMENT元素名稱元素內(nèi)容>
在上面元素的定義格式中,包含“元素名稱”和“元素內(nèi)容”。其中,“元素名稱”是自定義的名稱,它用于定義被約束XML文檔中的元素,“元素內(nèi)容”是對(duì)元素包含內(nèi)容的聲明,包括數(shù)據(jù)類型和符號(hào)兩部分,它共有5種內(nèi)容形式,具體如下。(1)#PCDATA:表示元素中嵌套的內(nèi)容是普通文本字符串,其中關(guān)鍵字PCDATA是ParsedCharacterData的簡(jiǎn)寫。例如,<!ELEMENT書名(#PCDATA)>表示書名所嵌套的內(nèi)容是字符串類型。(2)子元素:說(shuō)明元素包含的元素。通常用一對(duì)圓括號(hào)()將元素中要嵌套的一組子元素括起來(lái),例如,<!ELEMENT書(書名,作者,售價(jià))>表示元素書中要嵌套書名、作者、售價(jià)等子元素。(3)混合內(nèi)容:表示元素既可以包含字符數(shù)據(jù),也可以包含子元素?;旌蟽?nèi)容必須被定義零個(gè)或多個(gè),例如,<!ELEMENT書(#PCDATA|書名)*>表示書中嵌套的子元素書名包含零個(gè)或多個(gè),并且書名是字符串文本格式。(4)EMPTY:表示該元素既不包含字符數(shù)據(jù),也不包含子元素,是一個(gè)空元素。如果在文檔中元素本身已經(jīng)表明了明確的含義,就可以在DTD中用關(guān)鍵字EMPTY表明空元素。例如,<!ELEMENTbrEMPTY>,其中br是一個(gè)沒(méi)有內(nèi)容的空元素。(5)ANY:表示該元素可以包含任何的字符數(shù)據(jù)和子元素。例如,<!ELEMENT聯(lián)系人ANY>表示聯(lián)系人可以包含任何形式的內(nèi)容。但在實(shí)際開發(fā)中,應(yīng)該盡量避免使用ANY,因?yàn)槌烁赝?,其他使用ANY的元素都將失去DTD對(duì)XML文檔的約束效果。需要注意的是,在定義元素時(shí),元素內(nèi)容中可以包含一些符號(hào),不同的符號(hào)具有不同的作用,下面介紹一些常見(jiàn)的符號(hào)。(1)問(wèn)號(hào)[?]:表示該對(duì)象可以出現(xiàn)0次或1次。(2)星號(hào)[*]:表示該對(duì)象可以出現(xiàn)0次或多次。(3)加號(hào)[+]:表示該對(duì)象可以出現(xiàn)1次或多次。(4)豎線[|]:表示在列出的對(duì)象中選擇1個(gè)。(5)逗號(hào)[,]:表示對(duì)象必須按照指定的順序出現(xiàn)。(6)括號(hào)[()]:用于給元素進(jìn)行分組。2.屬性定義在DTD文檔中,定義元素的同時(shí),還可以為元素定義屬性。DTD屬性定義的基本語(yǔ)法格式如下所示:
<!ATTLIST元素名
屬性名1屬性類型設(shè)置說(shuō)明
屬性名2屬性類型設(shè)置說(shuō)明
…
>
在上面屬性定義的語(yǔ)法格式中,“元素名”是屬性所屬元素的名字,“屬性名”是屬性的名稱,“屬性類型”則是用來(lái)指定該屬性是屬于哪種類型,“設(shè)置說(shuō)明”用來(lái)說(shuō)明該屬性是否必須出現(xiàn)。關(guān)于“屬性類型”和“設(shè)置說(shuō)明”的相關(guān)講解,具體如下。1)設(shè)置說(shuō)明定義元素的屬性時(shí),有4種設(shè)置說(shuō)明可以選擇,具體如下。(1)#REQUIRED#REQUIRED表示元素的該屬性是必需的,例如,當(dāng)定義聯(lián)系人信息的DTD時(shí),我們希望每一個(gè)聯(lián)系人都有一個(gè)聯(lián)系電話屬性,這時(shí),可以在屬性聲明時(shí),使用REQUIRED。(2)#IMPLIED#IMPLIED表示元素可以包含該屬性,也可以不包含該屬性。例如,當(dāng)定義一本書的信息時(shí),發(fā)現(xiàn)書的頁(yè)數(shù)屬性對(duì)讀者無(wú)關(guān)緊要,這時(shí),在屬性聲明時(shí),可以使用IMPLIED。(3)#FIXED#FIXED表示一個(gè)固定的屬性默認(rèn)值,在XML文檔中不能將該屬性設(shè)置為其他值。使用#FIXED關(guān)鍵字時(shí),還需要為該屬性提供一個(gè)默認(rèn)值。當(dāng)XML文檔中沒(méi)有定義該屬性時(shí),其值將被自動(dòng)設(shè)置為DTD中定義的默認(rèn)值。(4)默認(rèn)值和FIXED一樣,如果元素不包含該屬性,該屬性將被自動(dòng)設(shè)置為DTD中定義的默認(rèn)值。不同的是,該屬性的值是可以改變的,如果XML文件中設(shè)置了該屬性,新的屬性值會(huì)覆蓋DTD中定義的默認(rèn)值。2)屬性類型在DTD中定義元素的屬性時(shí),有10種屬性類型可以選擇,具體如下。(1)CDATA這是最常用的一種屬性類型,表明屬性類型是字符數(shù)據(jù),與元素內(nèi)容說(shuō)明中的#PCDATA相同。當(dāng)然,在屬性設(shè)置值中出現(xiàn)的特殊字符,也需要使用其轉(zhuǎn)義字符序列來(lái)表示,例如,用&表示字符(&),用<表示字符(<)等。(2)Enumerated在聲明屬性時(shí),可以限制屬性的取值只能從一個(gè)列表中選擇,這類屬性屬于Enumerated(枚舉類型)。需要注意的是,在DTD定義中并不會(huì)出現(xiàn)關(guān)鍵字Enumerated。接下來(lái)通過(guò)一個(gè)案例來(lái)學(xué)習(xí)如何定義Enumerated類型的屬性,如例1-10所示。例1-10enum.xml
1<?xmlversion="1.0"encoding="GB2312"standalone="yes"?>
2<!DOCTYPE購(gòu)物籃[
3<!ELEMENT購(gòu)物籃ANY>
4<!ELEMENT肉EMPTY>
5<!ATTLIST肉品種(雞肉|牛肉|豬肉|魚肉)"雞肉">
6]>
7<購(gòu)物籃>
8<肉品種="魚肉"/>
9<肉品種="牛肉"/>
10<肉/>
11</購(gòu)物籃>
在例1-10中,“品種”屬性的類型是Enumerated,其值只能為“雞肉”、“牛肉”、“豬肉”和“魚肉”,而不能使用其他值?!捌贩N”屬性的默認(rèn)值是“雞肉”,所以,即使<購(gòu)物籃>元素中的第三個(gè)子元素沒(méi)有顯式定義“品種”這個(gè)屬性,但它實(shí)際上也具有“品種”這個(gè)屬性,且屬性的取值為“雞肉”。(3)ID一個(gè)ID類型的屬性用于唯一標(biāo)識(shí)XML文檔中的一個(gè)元素。其屬性值必須遵守XML名稱定義的規(guī)則。一個(gè)元素只能有一個(gè)ID類型的屬性,而且ID類型的屬性必須設(shè)置為#IMPLIED或#REQUIRED。因?yàn)镮D類型屬性的每一個(gè)取值都是用來(lái)標(biāo)識(shí)一個(gè)特定的元素,所以,為ID類型的屬性提供默認(rèn)值,特別是固定的默認(rèn)值是毫無(wú)意義的。接下來(lái)通過(guò)一個(gè)案例來(lái)學(xué)習(xí)如何定義一個(gè)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)系人編號(hào)ID#REQUIRED>
8]>
9<聯(lián)系人列表>
10<聯(lián)系人編號(hào)="id1">
11<姓名>張三</姓名>
12<EMAIL>zhang@</EMAIL>
13</聯(lián)系人>
14<聯(lián)系人編號(hào)="id2">
15<姓名>李四</姓名>
16<EMAIL>li@</EMAIL>
17</聯(lián)系人>
18</聯(lián)系人列表>
在例1-11中,將元素為<聯(lián)系人>的編號(hào)屬性設(shè)置為#REQUIRED,說(shuō)明每個(gè)聯(lián)系人都有一個(gè)編號(hào),同時(shí),屬性編號(hào)的類型為ID,說(shuō)明編號(hào)是唯一的。如此一來(lái),通過(guò)編號(hào)就可以找到唯一對(duì)應(yīng)的聯(lián)系人了。(4)IDREF和IDREFS例1-11中,雖然張三和李四兩個(gè)聯(lián)系人的ID編號(hào)是唯一的,但是這兩個(gè)ID類型的屬性沒(méi)有發(fā)揮作用,這時(shí)可以使用IDREF類型,使這兩個(gè)聯(lián)系人之間建立一種一對(duì)一的關(guān)系。接下來(lái)通過(guò)一個(gè)案例來(lái)學(xué)習(xí)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編號(hào)ID#REQUIRED
9上司IDREF#IMPLIED>
10]>
11<聯(lián)系人列表>
12<聯(lián)系人編號(hào)="id1">
13<姓名>張三</姓名>
14<EMAIL>zhang@</EMAIL>
15</聯(lián)系人>
16<聯(lián)系人編號(hào)="id2"上司="id1">
17<姓名>李四</姓名>
18<EMAIL>li@</EMAIL>
19</聯(lián)系人>
20</聯(lián)系人列表>
在例1-12中,為元素<聯(lián)系人列表>的子元素<聯(lián)系人>增加了一個(gè)名稱為“上司”的屬性,并且將該屬性的類型設(shè)置為IDREF,IDREF類型屬性的值必須為一個(gè)已經(jīng)存在的ID類型的屬性值。在第二個(gè)<聯(lián)系人>元素中,將“上司”屬性設(shè)置為第一個(gè)聯(lián)系人的編號(hào)屬性值,如此一來(lái),就形成了兩個(gè)聯(lián)系人元素之間的對(duì)應(yīng)關(guān)系,即李四的上司為張三。IDREF類型可以使兩個(gè)元素之間建立一對(duì)一的關(guān)系,但是,如果兩個(gè)元素之間的關(guān)系是一對(duì)多,例如,一個(gè)學(xué)生去圖書館可以借多本書,這時(shí),需要使用IDREFS類型來(lái)指定某個(gè)人借閱了哪些書。需要注意的是,IDREFS類型的屬性可以引用多個(gè)ID類型的屬性值,這些ID的屬性值需要用空格分隔。接下來(lái)通過(guò)一個(gè)案例來(lái)學(xué)習(xí)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è)培訓(xùn)教材</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的屬性設(shè)置為ID類型,元素<person>中名為borrowed的屬性設(shè)置為IDREFS類型。從library.xml文檔中可以看出,張三借閱了《Java就業(yè)培訓(xùn)教材》和《Java開發(fā)寶典》這兩本書,而李四則借閱了《Java就業(yè)培訓(xùn)教材》、《JavaWeb開發(fā)內(nèi)幕》和《Java開發(fā)寶典》這三本書。(5)NMTOKEN和NMTOKENSNMTOKEN是NameToken的簡(jiǎn)寫,它表示由一個(gè)或者多個(gè)字母、數(shù)字、句點(diǎn)(.)、連字號(hào)(-)或下劃線(_)所組成的一個(gè)名稱。NMTOKENS關(guān)鍵字表示一種列表類型。一個(gè)元素的NMOTOKENS類型的屬性設(shè)置值可以是同一個(gè)XML文件中的另外多個(gè)NMTOKEN類型的屬性的設(shè)置值,每個(gè)NMTOKEN屬性值之間用空格分隔。具體示例如下:
<!ELEMENT用戶EMPTY>
<!ATTLIST用戶姓名NMTOKEN#REQUIRED>
<!ELEMENT數(shù)據(jù)(#PCDATA)>
<!ATTLIST數(shù)據(jù)授權(quán)用戶NMTOKENS#IMPLIED>
在上面的示例中,元素<用戶>的“姓名”屬性指定為NMTOKEN類型,元素<數(shù)據(jù)>的“授權(quán)用戶”屬性指定為NMTOKENS,與這段DTD定義語(yǔ)句對(duì)應(yīng)的XML具體如下:
<用戶姓名="張三">
<用戶姓名="李四">
<數(shù)據(jù)授權(quán)用戶="張三李四">
這里是一些授權(quán)訪問(wèn)的數(shù)據(jù)
</數(shù)據(jù)>
(6)NOTATION現(xiàn)實(shí)世界中存在很多無(wú)法或不易用XML格式組織的數(shù)據(jù),如圖像、聲音、影像等。對(duì)于這些數(shù)據(jù),XML應(yīng)用程序常常并不提供直接的應(yīng)用支持,但可以通過(guò)設(shè)置NOTATION類型的屬性來(lái)讓一個(gè)外部應(yīng)用程序進(jìn)行處理。在DTD文件中,NOTATION定義語(yǔ)句分為兩種情況,具體如下:
第一種情況:<!NOTATION符號(hào)名SYSTEM"MIME類型">
第二種情況:<!NOTATION符號(hào)名SYSTEM"URL路徑名">
在上述定義語(yǔ)句中,第一種情況指定數(shù)據(jù)的MIME類型,第二種情況指定處理程序的URL路徑。當(dāng)使用NOTATION類型作為屬性的類型時(shí),首先要在DTD中使用<!NOTATION…>語(yǔ)句定義相應(yīng)的notation,接下來(lái)通過(guò)一個(gè)示例來(lái)演示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電影演示設(shè)備NOTATION(mp|gif)#REQUIRED>
8]>
9<文件>
10<電影演示設(shè)備="mp"/>
11<文件>
在例1-14中,元素<電影>指定了兩種可選的演示設(shè)備,一種是movPlayer.exe,另一種是用來(lái)繪制GIF圖像的應(yīng)用程序。(7)ENTITY和ENTITYSENTITY對(duì)應(yīng)的中文意思為實(shí)體(關(guān)于實(shí)體定義的細(xì)節(jié),將在后面進(jìn)行介紹)。當(dāng)某個(gè)屬性的類型設(shè)置為ENTITY時(shí),表明其屬性值必須為在DTD中使用<!ENTITY…>語(yǔ)句定義的一個(gè)實(shí)體的引用。接下來(lái)看一段DTD定義的語(yǔ)句,具體如下:
<!ENTITYitcast"傳智播客論壇交流,">
<!ELEMENT電影EMPTY>
<!ATTLIST電影來(lái)源ENTITY#REQUIRED>
與這段DTD定義語(yǔ)句對(duì)應(yīng)的XML數(shù)據(jù)片段如下:
<電影來(lái)源="&itcast;"/>
需要注意的是,只有引用實(shí)體才可以作為ENTITY類型屬性的設(shè)置值,參數(shù)實(shí)體不能用作ENTITY類型的屬性的設(shè)置值。關(guān)于參數(shù)實(shí)體和引用實(shí)體的相關(guān)講解,將在實(shí)體定義中進(jìn)行詳細(xì)講解。ENTITYS關(guān)鍵字用于表示一種列表類型,一個(gè)元素的ENTITYS類型的屬性設(shè)置值可以是多個(gè)實(shí)體的引用,每個(gè)實(shí)體的引用之間用空格分隔,具體示例如下:
<!ENTITYbannerSYSTEM"/images/topword.gif">
<!ENTITYlogoSYSTEM"/images/logo.gif">
<!ATTLISTimagesrcENTITIES#REQUIRED>
根據(jù)上面的DTD語(yǔ)句,如果想通過(guò)src屬性引用兩幅圖像,則對(duì)應(yīng)的XML數(shù)據(jù)如下所示:
<imgsrc="logobanner">
3.實(shí)體定義有時(shí)候需要在多個(gè)文檔中調(diào)用同樣的內(nèi)容,例如公司名稱、版權(quán)聲明等,為了避免重復(fù)輸入這些內(nèi)容,可以通過(guò)<!ENTITY…>語(yǔ)句定義一個(gè)表示這些內(nèi)容的實(shí)體,然后在各個(gè)文檔中引用實(shí)體名替代它所表示的內(nèi)容。實(shí)體可分為兩種類型,分別是引用實(shí)體和參數(shù)實(shí)體,接下來(lái),針對(duì)這兩種實(shí)體類型進(jìn)行詳細(xì)的講解。1)引用實(shí)體引用實(shí)體的語(yǔ)法定義格式有兩種:
1<!ENTITY實(shí)體名稱"實(shí)體內(nèi)容">
2<!ENTITY實(shí)體名稱SYSTEM"外部XML文檔的URL">
引用實(shí)體用于解決XML文檔中內(nèi)容重復(fù)的問(wèn)題,其引用方式為:
&實(shí)體名稱;
了解了引用實(shí)體的語(yǔ)法格式及其在XML文檔中的引用方式,接下來(lái)通過(guò)一個(gè)案例來(lái)學(xué)習(xí),如例1-15和例1-16所示。例1-15book.dtd
1<!ENTITYitcast"傳智播客官網(wǎng),">
2<!ELEMENT書架(書+)>
3<!ELEMENT書(書名,作者,售價(jià))>
4<!ELEMENT書名(#PCDATA)>
5<!ELEMENT作者(#PCDATA)>
6<!ELEMENT售價(jià)(#PCDATA)>
例1-16book.xml
1<?xmlversion="1.0"encoding="GB2312"?>
2<!DOCTYPE書架SYSTEM"book.dtd">
3<書架>
4<書>
5<書名>Java就業(yè)培訓(xùn)教程</書名>
6<作者>&itcast;</作者>
7<售價(jià)>39.9</售價(jià)>
8</書>
9<書>
10<書名>EJB3.0入門經(jīng)典</書名>
11<作者>黎活明</作者>
12<售價(jià)>39.00元</售價(jià)>
13</書>
14</書架>
用IE9.0以下的瀏覽器打開book.xml文件,瀏覽器顯示的結(jié)果如圖1-10所示。圖1-10運(yùn)行結(jié)果圖1-10提示的錯(cuò)誤信息是“文本內(nèi)容中發(fā)現(xiàn)無(wú)效字符?!边@是因?yàn)閎ook.dtd文件使用的是本地字符集編碼,即GB2312編碼,而DTD文件應(yīng)該使用UTF-8或者Unicode編碼。需要注意的是,IE9.0以上版本的瀏覽器不會(huì)提示錯(cuò)誤。下面將book.dtd按照UTF-8編碼方式重新保存,保存方式如圖1-11所示。圖1-11選擇編碼保存按照?qǐng)D1-11的方式完成編碼保存后,用IE瀏覽器重新打開book.xml文件或者單擊圖1-10工具欄中的“刷新”按鈕,瀏覽器顯示的結(jié)果如圖1-12所示。圖1-12運(yùn)行結(jié)果從圖1-12中可以看出,book.xml文件中的“&itcast;”被顯示成“傳智播客官網(wǎng),”。2)參數(shù)實(shí)體參數(shù)實(shí)體只能被DTD文件自身使用,它的語(yǔ)法格式為:
<!ENTITY%實(shí)體名稱"實(shí)體內(nèi)容">
需要注意的是,在聲明參數(shù)實(shí)體時(shí),ENTITY、%、實(shí)體名和“實(shí)體內(nèi)容”之間各有一個(gè)空格。引用參數(shù)實(shí)體的方式是:
%實(shí)體名稱;
了解了參數(shù)實(shí)體的語(yǔ)法格式和引用方式,接下來(lái)通過(guò)一段示例代碼來(lái)演示參數(shù)實(shí)體的定義,具體如下:
<!ENTITY%TAG_NAME"姓名|EMAIL|電話|地址">
<!ELEMENT個(gè)人信息(%TAG_NAME;|生日)>
<!ELEMENT客戶信息(%TAG_NAME;|公司名)>
在上面的示例中,DTD中定義了兩個(gè)元素,分別是“個(gè)人信息”和“客戶信息”,這兩個(gè)元素的定義中都包含“姓名|EMAIL|電話|地址”這一相同的部分,因此,可以將相同的部分定義為一個(gè)TAG_NAME的參數(shù)實(shí)體,然后將“個(gè)人信息”和“客戶信息”這兩個(gè)元素的定義規(guī)則中的“姓名|EMAIL|電話|地址”部分替換成對(duì)TAG_NAME這個(gè)參數(shù)實(shí)體的引用即可。參數(shù)實(shí)體不僅可以簡(jiǎn)化元素中定義的相同內(nèi)容,還可以簡(jiǎn)化屬性的定義,具體示例如下:
<!ENTITY%common.attributes
'idID#IMPLIED
accountCDATA#REQUIRED'
>
<!ELEMENTpurchaseOrder(item+,manufacturer)>
<!ELEMENTitem(price,quantity)>
<!ELEMENTmanufacturer(#PCDATA)>
<!ATTLISTpurchaseOrder%common.attributes;>
<!ATTLISTitem%common.attributes;>
<!ATTLISTmanufacturer%common.attributes;>
在上面的示例中,由于多個(gè)元素都具有id和account這兩個(gè)屬性的相同定義,因此,可以將這兩個(gè)屬性的文本內(nèi)容定義為一個(gè)名稱為common.attributes的參數(shù)實(shí)體。當(dāng)定義元素的屬性時(shí),通過(guò)引用common.attributes這個(gè)參數(shù)實(shí)體,將該參數(shù)實(shí)體轉(zhuǎn)換為id和account這兩個(gè)屬性所定義的文本內(nèi)容。值得一提的是,當(dāng)DTD的元素和屬性定義中要出現(xiàn)大量相同內(nèi)容時(shí),參數(shù)實(shí)體是一種非常不錯(cuò)的選擇。因?yàn)槿绻枰薷腄TD中相同的部分,只需要在參數(shù)實(shí)體的定義中修改即可。1.4Schema約束1.4.1什么是Schema約束同DTD一樣,XMLSchema也是一種用于定義和描述XML文檔結(jié)構(gòu)與內(nèi)容的模式語(yǔ)言,它的出現(xiàn)克服了DTD的局限性。接下來(lái),通過(guò)XMLSchema與DTD的比較,將XMLSchema所具有的一些顯著優(yōu)點(diǎn)進(jìn)行列舉,具體如下。(1)DTD采用的是非XML語(yǔ)法格式,缺乏對(duì)文檔結(jié)構(gòu)、元素、數(shù)據(jù)類型等全面的描述。而XMLSchema采用的是XML語(yǔ)法格式,而且它本身也是一種XML文檔,因此,XMLSchema語(yǔ)法格式比DTD更好理解。(2)XML有非常高的合法性要求,雖然DTD和XMLSchema都用于對(duì)XML文檔進(jìn)行描述,都被用作驗(yàn)證XML合法性的基礎(chǔ)。但是,DTD本身合法性的驗(yàn)證必須采用另外一套機(jī)制,而XMLSchema則采用與XML文檔相同的合法性驗(yàn)證機(jī)制。(3)XMLSchema對(duì)名稱空間支持得非常好,而DTD幾乎不支持名稱空間。(4)DTD支持的數(shù)據(jù)類型非常有限。例如,DTD可以指定元素中必須包含字符文本(PCDATA),但無(wú)法指定元素中必須包含非負(fù)整數(shù)(nonNegativeInteger),而XMLSchema比XMLDTD支持更多的數(shù)據(jù)類型,包括用戶自定義的數(shù)據(jù)類型。(5)DTD定義約束的能力非常有限,無(wú)法對(duì)XML實(shí)例文檔做出更細(xì)致的語(yǔ)義限制,例如,無(wú)法很好地指定一個(gè)元素中的某個(gè)子元素必須出現(xiàn)7~12次;而XMLSchema定義約束的能力非常強(qiáng)大,可以對(duì)XML實(shí)例文檔做出細(xì)致的語(yǔ)義限制。通過(guò)上面的比較可以發(fā)現(xiàn),XMLSchema的功能比DTD強(qiáng)大很多,但相應(yīng)的語(yǔ)法也比DTD復(fù)雜很多,接下來(lái)看一個(gè)簡(jiǎn)單的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名稱空間一個(gè)XML文檔可以引入多個(gè)約束文檔,但是,由于約束文檔中的元素或?qū)傩远际亲远x的,因此,在XML文檔中,極有可能出現(xiàn)代表不同含義的同名元素或?qū)傩裕瑢?dǎo)致名稱發(fā)生沖突。為此,在XML文檔中,提供了名稱空間,它可以唯一標(biāo)識(shí)一個(gè)元素或者屬性。這就好比打車去小營(yíng),由于北京有兩個(gè)地方叫小營(yíng),為了避免司機(jī)走錯(cuò),我們就會(huì)說(shuō)“去亞運(yùn)村的小營(yíng)”或者“去清河的小營(yíng)”。這時(shí)的亞運(yùn)村或者清河就相當(dāng)于一個(gè)名稱空間。在使用名稱空間時(shí),首先必須聲明名稱空間。名稱空間的聲明就是在XML實(shí)例文檔中為某個(gè)模式文檔的名稱空間指定一個(gè)臨時(shí)的簡(jiǎn)寫名稱,它通過(guò)一系列的保留屬性來(lái)聲明,這種屬性的名字必須是以“xmlns”或者以“xmlns:”作為前綴。它與其他任何XML屬性一樣,都可以通過(guò)直接或者使用默認(rèn)的方式給出。名稱空間聲明的語(yǔ)法格式如下所示:
<元素名xmlns:prefixname="URI">
在上述語(yǔ)法格式中,“元素名”指的是在哪一個(gè)元素上聲明名稱空間,在這個(gè)元素上聲明的名稱空間適用于聲明它的元素和屬性,以及該元素中嵌套的所有元素及其屬性。xmlns:prefixname指的是該元素的屬性名,它所對(duì)應(yīng)的值是一個(gè)URI引用,用來(lái)標(biāo)識(shí)該名稱空間的名稱。需要注意的是,如果有兩個(gè)URI并且其組成的字符完全相同,就可以認(rèn)為它們標(biāo)識(shí)的是同一個(gè)名稱空間。了解了名稱空間的聲明方式,接下來(lái)通過(guò)一個(gè)案例來(lái)學(xué)習(xí),如例1-18所示。例1-18book.xml
1<?xmlversion="1.0"encoding="UTF-8"?>
溫馨提示
- 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度廠房拆遷補(bǔ)償與社區(qū)和諧共建協(xié)議書范本4篇
- 2025年度建筑垃圾清運(yùn)及拆除合同模板4篇
- 個(gè)人汽車抵押貸款合同范本2024版B版
- 2025年度柴油發(fā)電機(jī)環(huán)保排放標(biāo)準(zhǔn)達(dá)標(biāo)改造合同4篇
- 2024石材加工廠設(shè)備安裝與調(diào)試的合同協(xié)議
- 2025年度旅游目的地策劃合同范本(十)4篇
- 2025年度互聯(lián)網(wǎng)平臺(tái)產(chǎn)品試用合作框架合同4篇
- 2025年度科技企業(yè)孵化器場(chǎng)地?zé)o償借用協(xié)議3篇
- 二零二五年度文化產(chǎn)業(yè)園場(chǎng)地租賃與文化項(xiàng)目合作合同6篇
- 專業(yè)貸款協(xié)議范本2024年版一
- 搶救制度試卷附有答案
- 勞務(wù)派遣勞務(wù)外包服務(wù)方案(技術(shù)方案)
- 2023年藥品注冊(cè)專員年度總結(jié)及來(lái)年計(jì)劃
- 易普拉格科研管理系統(tǒng)
- 最終版 古城文化修復(fù)監(jiān)理大綱
- GB/T 43391-2023市場(chǎng)、民意和社會(huì)調(diào)查調(diào)查報(bào)告編制指南
- 拔罐技術(shù)操作考核評(píng)分標(biāo)準(zhǔn)
- 軟件無(wú)線電原理與應(yīng)用第3版 課件 第4-6章 軟件無(wú)線電硬件平臺(tái)設(shè)計(jì)、軟件無(wú)線電信號(hào)處理算法、信道編譯碼技術(shù)
- RB-T 099-2022 進(jìn)口食品供應(yīng)商評(píng)價(jià)技術(shù)規(guī)范
- 戒賭法律協(xié)議書范本
- (完整版)A4筆記本模板(可編輯修改word版)
評(píng)論
0/150
提交評(píng)論