1 引論
在 學(xué)習(xí)web過程中,無論是學(xué)習(xí)Tomcat,還是Struts,hibernate,Spring,都出現(xiàn)配置文件。而配置文件一般都是用XML語言編寫 的。從而對本文web應(yīng)用中的XML所起的作用產(chǎn)生了興趣。隨著分布式系統(tǒng)越來越流行,更多基于XML的技術(shù)都會出現(xiàn),研究目前XML在web應(yīng)用中對以 后學(xué)習(xí)和研究web新技術(shù)具有指導(dǎo)意義。
2 XML
2.1 什么是XML?
1998年2月發(fā)表的XML 1.0規(guī)范中有如下描述:
“eXtensible Markup Language (XML)是SGML的一個子集……其目標(biāo)是能夠以目前HTML可能實現(xiàn)的方式在web上使用、接受和處理通用SGML。XML的設(shè)計目標(biāo)是實現(xiàn)簡便并且能與SGML和HTML共同操作。”
也 就是說,XML是一個精簡的SGML,它保留了SGML的可擴展功能,將SGML的豐富功能和HTML的易用性結(jié)合到web應(yīng)用中。簡單地說,XML是一 種定義標(biāo)記語言的元標(biāo)記語言,是一套定義語義標(biāo)記的規(guī)則,即定義了用于定義其他與特定領(lǐng)域有關(guān)的、語義的、結(jié)構(gòu)化的標(biāo)記語言的語言。
XML不是HTML的擴展,而是一種用于定義標(biāo)記語言的類似于SGML的語言。XML不再使用固定標(biāo)記,而允許定義數(shù)量無限的標(biāo)記來描述文檔中的資料。HTML是web中顯示數(shù)據(jù)的通用方法,而XML著重描述web頁面的內(nèi)容。
為 了使編寫的web頁面成為一個有效的XML文檔,文檔中的每一個添加的標(biāo)記必須記入DTD(Document Type Definitions,文檔類型定義)中。XML主要用于描述web頁面的內(nèi)容,因此它必須與多種相關(guān)技術(shù)相互作用才能達到正確的顯示效果和鏈接。這些 技術(shù)主要包括CSS(Cascading Style Sheet,級聯(lián)樣式單)、XSL(eXtensible Style Language,可擴展樣式語言)和XLL(eXtensible Link Language,可擴展鏈接語言)。CSS可以使XML頁面具有更復(fù)雜的表現(xiàn)形式。XSL可以將XML 數(shù)據(jù)翻譯為HTML風(fēng)格或其他的風(fēng)格,并提供一種級聯(lián)樣式單的功能,使開發(fā)者能構(gòu)造出具有表達層次結(jié)構(gòu)的web頁面。XLL是XML的鏈接語言,它與 HTML的鏈接相似,但功能更強大,同時支持可擴展的鏈接和多方向的鏈接。
2.2 XML的優(yōu)點
1. 減少固有數(shù)據(jù)的障礙;
2. 讓應(yīng)用系統(tǒng)可以相同方式存取所有數(shù)據(jù);
3. 讓搜索更快速,更有效率;
4. 數(shù)據(jù)的比較與匯整更為便利;
5. 系統(tǒng)可以逐步修改,不需要大幅調(diào)整;
6. 具有識別數(shù)據(jù)提供者提供程序并驗證他的身份的功能;
7. 可降低重復(fù)數(shù)據(jù)的傳輸,強化網(wǎng)絡(luò)系統(tǒng)的使用效率。
2.3 XML的特點
(1)XML遵循嚴(yán)格的語法要求
瀏 覽器可以顯示有文法錯誤的HTML文件。但XML就不同了,它不但要求標(biāo)記配對、嵌套,而且還要求嚴(yán)格遵守DTD的規(guī)定,一個具有良好語法結(jié)構(gòu)的網(wǎng)頁文件 可以提供較好的可讀性和可維護性,從長遠來看還是大有好處的。何況這大大減輕了瀏覽器開發(fā)人員的負擔(dān),也提高了瀏覽器的時間空間效率。
(2)XML便于不同系統(tǒng)之間信息的傳輸
當(dāng)今的計算機世界中,不同企業(yè)、不同部門中存在著許多不同的系統(tǒng)。操作系統(tǒng)有NT、UNIX,數(shù)據(jù)庫系統(tǒng)有SQL Server、Oracle,...,要想在這些不同的平臺、不同的數(shù)據(jù)庫軟件之間傳輸信息,不得不使用一些特殊的軟件,非常之不便。而不同的顯示界面, 從工作站、個人微機、到手機,使這些信息的個性化顯示也變得很困難。
現(xiàn)在有了XML,各種不同的系統(tǒng)之間可以采用XML作為交流媒介。XML不但簡單易讀,而且可以標(biāo)注各種文字、圖像甚至二進制文件,只要有XML處理工具,就可以輕松地讀取并利用這些數(shù)據(jù),使得XML成為一種非常理想的網(wǎng)際語言。
(3)XML具有較好的保值性
XML的保值性來自它的先驅(qū)之一——SGML語言。SGML是一套歷史悠久的國際標(biāo)準(zhǔn),它具有強大復(fù)雜的功能。HTML目前是web頁面的顯示標(biāo)記語言。XML可以很好地與HTML和SGML兼容,具有較好的保值性。
2.4 XML組件
重要組件:元素、屬性、實體、DTD
元素:是文檔的一個成分。元素可能由其他元素、其他類型數(shù)據(jù)或描述性表示構(gòu)成。該描述性表示告知XML分析應(yīng)用程序關(guān)于存在于文檔外的什么地方的資源;
屬性:提供有關(guān)XML元素及其內(nèi)容的其他信息,由名-值對和等號算符組成;
實體:希望在文檔中引用的任何一部分數(shù)據(jù);
DTD:文檔類型定義。獨立于主XML文檔的單元,提供了該XML文檔所附的一組規(guī)則;
3 XML應(yīng)用
作為表達數(shù)據(jù)的一種規(guī)范,XML必須和具體的應(yīng)用結(jié)合起來才能體現(xiàn)出它的優(yōu)勢。
從XML剛引入開始,幾年內(nèi)已經(jīng)出現(xiàn)了許多XML應(yīng)用。如電子商務(wù),電子數(shù)據(jù)存儲,數(shù)據(jù)交換,前后檢索,多媒體傳輸,化學(xué)科技領(lǐng)域,以至于各個不同的領(lǐng)域的特殊文件格式,都可使用XML定義,達到網(wǎng)絡(luò)統(tǒng)一文件的目的,有人稱XML為“計算機語言的世界語”。
我們本文中主要是針對XML在web領(lǐng)域的應(yīng)用做一些說明,尋找出XML應(yīng)用的主要方面。
4 XML作為web配置文件
XML文件常用做各種web應(yīng)用的配置文件。下面列舉它在一些新的web技術(shù)中的應(yīng)用。
4.1 XML作為Tomcat的配置文件
下面是Tomcat服務(wù)器配置示例文件。這些組件的構(gòu)成是根據(jù)相互之間的父子關(guān)系進行嵌套的。
一 個“Server”是一個提供完整的JVM的獨立組件,它可以包含一個或多個“Service”實例。服務(wù)器在指定的端口上監(jiān)聽shutdown命令。一 個“Service”自身不是一個“Container”(容器),而是一個或多個共用一個單獨“Container”(容器)的 “Connectors”組合(因此,應(yīng)用程序在容器中可見)。通常,這個容器是一個“Engine”(引擎),但這不是必須的。
一個“Connector”(連接器)代表一個請求被接收和應(yīng)答所需要的端點。每個連
接器通過相關(guān)的“Container” (容器)處理請求。默認情況下,一個非SSL的HTTP/1.1的連接器被綁定在端口8080。在端口8443上定義一個SSL的HTTP/1.1的連接 器。在端口8009上定義一個Coyote/JK2 AJP 1.3連接器。在8082端口上定義一個代理HTTP/1.1連接器
一 個“Engine”(引擎)代表處理每個請求的入口點(在Catalina內(nèi))。這個Tomcat的標(biāo)準(zhǔn)獨立引擎實現(xiàn)分析包含在請求中的HTTP頭信息, 并將請求傳送到適當(dāng)?shù)闹鳈C或虛擬主機上。請求轉(zhuǎn)儲器值轉(zhuǎn)儲非常有用的通過Tomcat這個實例接收到的所有請求的,關(guān)于接收到的請求頭和cookies, 以及發(fā)送出的回應(yīng)頭和cookies的調(diào)試信息。如果你只在意一個特定的虛擬主機或者一個特定應(yīng)用程序的請求,在對應(yīng)的或入口中套用這個元素。通過定義這個群集元素,意味著每個管理員都將被改變。因此,當(dāng)運行一個群集時,只有確認在必須被聚集和移除其他的地方有你的web軟件。當(dāng)配置群集時,你也添加一個值來捕獲所有傳入的請求,在請求結(jié)束時,這個會話可能被子復(fù)制,也可能不被復(fù)制。
與 這個虛擬主機有關(guān)系所有上下文所共享的日志。默認情況下(使用FileLogger時),日志文件被創(chuàng)建在相對于$CATALINA_HOME目錄下的 logs目錄下。如果你希望,你也可以給directory指定一個不同的路徑??梢允褂孟鄬τ?CATALINA_HOME的相對路徑,也可以使用絕對 路徑。
debug="0"/>
type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved">
factory
org.apache.catalina.users.MemoryUserDatabaseFactory
pathname
conf/tomcat-users.xml
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
debug="0" connectionTimeout="20000" disableUploadTimeout="true" />
prefix="catalina_log." suffix=".txt" timestamp="true"/>
driverName="org.gjt.mm.mysql.Driver"
connectionURL="jdbc:mysql://localhost/authority"
connectionName="test" connectionPassword="test" userTable="users"
userNameCol="user_name" userCredCol="user_pass"
userRoleTable="user_roles" roleNameCol="role_name" />
driverName="oracle.jdbc.driver.OracleDriver"
connectionURL="jdbc:oracle:thin:@ntserver:1521:ORCL"
connectionName="scott" connectionPassword="tiger"userTable="users"
userNameCol="user_name" userCredCol="user_pass"
userRoleTable="user_roles" roleNameCol="role_name" />
driverName="sun.jdbc.odbc.JdbcOdbcDriver"
connectionURL="jdbc:odbc:CATALINA" userTable="users" userNameCol="user_name" userCredCol="user_pass userRoleTable="user_roles" roleNameCol="role_name" />
className="org.apache.catalina.cluster.mcast.McastService"
mcastAddr="228.0.0.4"
mcastPort="45564"
mcastFrequency="500"
mcastDropTime="3000"/>
className="org.apache.catalina.cluster.tcp.ReplicationListener"
tcpListenAddress="auto"
tcpListenPort="4001"
tcpSelectorTimeout="100"
tcpThreadCount="6"/>
className="org.apache.catalina.cluster.tcp.ReplicationTransmitter"
replicationMode="pooled"/>
filter=".*\.gif;.*\.js;.*\.jpg;.*\.htm;.*\.html;.*\.txt;"/>
4.2作為Struts的配置文件
在 基于Struts框架的web應(yīng)用中,有兩個重要的配置文件: web.xml 和struts-config.xml 。web.xml文件用于配置web應(yīng)用,如Servlet組件。struts-config.xml用于配置Struts框架,如各種Action組 件。
那么配置文件的作用是什么呢?
當(dāng)web容器啟動時,會加載并解析web.xml文件,而web.xml文件是將所有的組件組合起來構(gòu)成一個整體的文件。DTD對XML文檔的格式做了定義,DTD把XML文檔劃分為元素,屬性,實體。每一種XML文檔都有獨自的DTD文件,可以從網(wǎng)上下載。.如果把所有的組件比喻成人的四肢的話,那么web.xml文件相當(dāng)于人大大腦,它將各個組件協(xié)調(diào)起來,完成一定的任務(wù)。
不 過,web容器不支持動態(tài)加載web.xml文件,也就是說,一旦啟動了web容器,那么它將讀取web.xml文件,根據(jù)它來創(chuàng)建和配置各種 Struts組件。如果在不關(guān)閉web容器的情況下修改web.xml文件,那么系統(tǒng)是不會自動更新web.xml文件的。若希望看到修改后的 web.xml文件,則必須關(guān)閉web容器,然后再重新啟動。
下面讓我們來看一下web.xml的DTD
DTD
符號
含義
無符號
該子元素在父元素內(nèi)必須存在且只能存在一次
+
該子元素在父元素內(nèi)必須存在,可以存在一次或多次
*
該子元素在父元素內(nèi)可以不存在,或者存在一次或多次
?
該子元素在父元素內(nèi)可以不存在,或者只存在一次
是web.xml的根元素。
下面讓我們先看看web.xml文件的構(gòu)成。
PUBLIC “-//Sun Microsystems ,Inc.//DTD Web Application 2.2//EN”
“http://java.sun.com/j2ee/dtds/webapp_2_2.dtd”
>
…
…
…
…
…
…
…
…
…
…
…
…
…
…
…
…
…
…
…
…
…
…
…
…
…
…
…
…
(1) icon 子元素
它包含及,它的作用是圖形化其父元素,的內(nèi)容 是一個16x16的圖像文件,而的內(nèi)容是一個32x32的圖像文件。如下例子:
/images/smalllogo.gif
/images/largelogo.gif
(2) 子元素
它提供對父元素的短文字(short textual)描述信息,如下:
short textual discription of its parent element
(3) 子元素
它提供對父元素的完全(full-length textual)的描述信息,如下:
full-length textual discription of its parent element
(4)子元素
它在一個web應(yīng)用程序配置描述器中的出現(xiàn)標(biāo)明了該web應(yīng)用程序可以配置到分布式的servlet容器中。
(5) 子元素
context-param元素包含了web應(yīng)用程序的servlet上下文(servlet context)的初始化參數(shù)的聲明。
(6) 子元素
filter 元素聲明了web應(yīng)用程序里的一個filter。通過filter-name的值作為引用,在filter-mapping元素里,filter被映射到 一個Servlet或者是一個URL范式上。通過FilterConfig接口,filter可以使用配置描述器所聲明的初始化參數(shù)。
(7) 子元素
filter- mapping元素聲明了在wen應(yīng)用程序里面的filter映射。容器根據(jù)filter-mapping聲明來決定哪些filter按照什么順序應(yīng)用于 一個請求上。容器匹配按照正常方式訪問一個Servlet的請求URI。然后根據(jù)所有filter-mapping的servlet-name或者是 url-pattern來決定哪個filter可以應(yīng)用到該URI之上。決定filter調(diào)用順序的是適合該URI的filter-mapping列表中 的filter順序。
(8) 子元素
如果某個會話在一定時間內(nèi)未被訪問,服務(wù)器可以拋棄它以節(jié)省內(nèi)存。
(9)
listener元素標(biāo)明了一個web應(yīng)用程序的listener bean的配置屬性。
(10) < servlet>子元素
servlet元素的內(nèi)容是一個servlet的數(shù)據(jù)聲明。如果指定了一個jsp文件而且load-on-startup
元素出現(xiàn)了,則該JSP必須被預(yù)編譯并載入。
(11) 子元素
servlet-mapping元素定義了一個在一個servlet和一個url范式之間的映射。
(12) < session-config>子元素
session-config元素定義了該web應(yīng)用程序的session參數(shù)。
(13) < mime-mapping>子元素
mime-mapping 元素定義了一個在后綴名和mime類型之間的映射。
(14) < welcome-file-list>子元素
當(dāng)客戶訪問Web應(yīng)用時,如果僅僅給出Web應(yīng)用的Root URL,,沒有指定具體的文件名,Web容器會自動調(diào)用Web應(yīng)用的歡迎文件。元素用來設(shè)置歡迎文件清單。中可以有多個元素。
(15) 子元素
error-page元素的內(nèi)容是一個錯誤代碼或者例外類型和該web應(yīng)用程序里面的一個資源的路徑的映射。
(16) < taglib>子元素
taglib元素是用來描述一個JSP標(biāo)志庫的。
(17) 子元素
resource-env-ref元素的內(nèi)容是一個web應(yīng)用程序?qū)σ粋€和一個web應(yīng)用程序環(huán)境里的資源聯(lián)合了
的管理對象的應(yīng)用。它由以下幾個組成:一個可選的描述,該資源的環(huán)境引用的名字,和一個該web
應(yīng)用程序代碼所需要的資源環(huán)境引用類型的指明。
(18) < resource-ref>子元素
resource-ref元素的內(nèi)容是一個對web應(yīng)用程序?qū)σ粋€外部資源的引用。它由一個可選的描述,一
個資源管理器連接工廠引用的名字,web應(yīng)用程序代碼中所需要的資源管理器連接工廠的類型指示,
應(yīng)用程序或者容器的身份鑒證的類型和一個可選的從該資源所得連接得可共享性說明(其值為
Shareable或者是Unchareable)。
(19) 子元素
security-constaint元素用來在聯(lián)合一個或多個web資源集合和安全約束時使用。
(20) < env-entry>子元素
env-entry元素的內(nèi)容是一個web應(yīng)用程序的環(huán)境入口(environment entry)的聲明。該聲明由
一個可選的描述,該環(huán)境入口的名字,和一個可選的值組成。如果值沒有指定,則必須在配置的時
候提供一個。
(21)子元素
ejb-ref元素是用來聲明一個對enterprise bean的home的引用。該聲明由以下幾部分組成:
- 一個可選的說明(description)
- 在引用了該enterprise bean的web應(yīng)用程序的代碼中所使用的該EJB的引用名。
- 所引用的enterprise bean所期望的類型。(the expected type of the
referenced enterprise bean)
- 所期望的所引用的enterprise bean的home和遠程接口。(the expected home and
remote interfaces of the referenced enterprise bean)
- 可選的ejb-link信息,用來標(biāo)明所引用的enterprise bean。
(22)子元素
ejb-local-ref元素是用來聲明一個對enterprise bean的本地 home的引用。該聲明由以下幾
部分組成:
- 一個可選的說明(description)
- 在引用了該enterprise bean的web應(yīng)用程序的代碼中所使用的該EJB的引用名。
- 所引用的enterprise bean所期望的類型。(the expected type of the
referenced enterprise bean)
- 所期望的所引用的enterprise bean的本地 home和本地接口。(the expected local
home and local interfaces of the referenced enterprise bean)
- 可選的ejb-link信息,用來標(biāo)明所引用的enterprise bean。
當(dāng)Struts框架啟動時,會加載并解析struts-config.xml文件。Struts的核心是struts-config.xml配置文件,在這個文件里描述了所有的Struts組件。
Struts配置文件使得開發(fā)者可以靈活地組裝和配置各個組件,提高了應(yīng)用軟件的可擴展性和靈活性,可以避免硬編碼。
Struts配置文件是基于XML的。
Struts-config 的DTD
Servlet-config是Struts配置文件的根元素,和它對應(yīng)的配置類為org.apache.struts.config.ModuleConfig類。
下面讓我們先看看struts-config.xml文件的構(gòu)成。
PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">
注意:以上各元素的順序是非常重要的,struts-config.xml配置文件必須按照這個順序進行配置,否則在容器啟動的時候就會出錯。
struts-config.xml的子元素:
(1)data-sources
的屬性及其描述信息如下:
屬性描述信息
Key 綁定在ServletContext上的DataSource實例的索引鍵,若不設(shè)定則缺省為Action.DATA_SOURCE_KEY,如果在應(yīng)用程序中有多于一個的DataSource,則必須設(shè)置Key的值。
DriverClass 所用的JDBC驅(qū)動類(必須的)如:com.microsoft.jdbc.sqlserver.SQLServerDriver
url 所用的JDBC的URL(必須的)如:jdbc:microsoft:sqlserver://xg088:1433
MaxCount 同時打開的最大連結(jié)數(shù),缺省值為2(可選的)
MinCount 同時打開的最小連結(jié)數(shù),缺省值為1(可選的)
User 連結(jié)到數(shù)據(jù)庫的用戶名(必須的)
Password 連結(jié)到數(shù)據(jù)庫的密碼(必須的)
Description 關(guān)于DataSource的描述信息(可選的)
ReadOnly 如果設(shè)為true,則表示該連結(jié)是只讀的,缺省為false。(可選的)
LoginTimeout 創(chuàng)建連結(jié)的最大允許時間,以秒為單位。(可選的)
AutoCommit 如果為true,則每次execute之后會強制回滾。缺省為true。(可選的)
舉例說明: