麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(yè) > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

教您如何用Zeus實(shí)現(xiàn)XML-Java的數(shù)據(jù)綁定

2019-11-18 11:34:51
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

教您如何用Zeus實(shí)現(xiàn)xml-java的數(shù)據(jù)綁定   作者:鐘家豪  來(lái)源:http://www.cjsdn.net


Zeus可以將JAVA對(duì)象與XML文件進(jìn)行綁定,綁定使數(shù)據(jù)在J2EE中的應(yīng)用更加方便。本文主要介紹Zeus的編譯與使用。對(duì)綁定過(guò)程中使用的DTD和XML文件也有說(shuō)明。
1、ZEUS簡(jiǎn)介
Enhydra是以生長(zhǎng)于美國(guó)加利福尼亞海邊的小水獺命名的非營(yíng)利組織的名字。從但與聞名的Apache不同,Enhydra致力于圍繞application Server的電子商務(wù)解決方案的研究。
Zeus就是Enhydra開發(fā)的眾多的工具軟件中的一個(gè),功能是對(duì)JavaObject和XML進(jìn)行數(shù)據(jù)綁定。它可以將任意的XML文件轉(zhuǎn)化為對(duì)應(yīng)的JavaObject文件,并且將數(shù)據(jù)方便的在這兩種形式之間轉(zhuǎn)換。Zeus最新版本是Zeus1.0 Beta 3.5,由于是完全的源碼開放,可以到 http://zeus.enhydra.org/software/downloads/index.Html下載源代碼后自己編譯。
2、預(yù)備知識(shí)
2.1 用XML作為數(shù)據(jù)載體
XML(Extensible Markup Language)由W3C組織制定并得到世界上幾乎所有大公司的支持。XML是一種非常靈活的文本格式,與HTML相比,XML延續(xù)了其簡(jiǎn)單、易懂的語(yǔ)法,但是卻有了更大的靈活性和擴(kuò)展能力。例1是一段描述Customer信息的XML文件,作為描述數(shù)據(jù)的語(yǔ)言,XML的組織形式很自由且表述清楚。

<?xml version="1.0" encoding="GBK"?>
<Customer Customer_No= "00001">
< Name>李俊</ Name>
<Id_No>210106421016001</Id_No>
<Sex >男</Sex>
<Birth_Place>大連</Birth_Place>
<Birth_Date>1942-10-16</Birth_Date>
<Nationality>中國(guó)</Nationality>
<EdUCation>高中</Education>
<Address>大連市沙河口</Address>
<Contact_Info Id = "00001">
<Zip_Code>116001</Zip_Code>
<Tel_No>2645677</Tel_No>
</Contact_Info>
</Customer>
 
 
例1:描述Customer的XML文件
這段XML結(jié)構(gòu)很清楚:描述的是一個(gè)"顧客"實(shí)體,這個(gè)實(shí)體有其屬性:姓名、身份證號(hào)、性別、出生地、生日、出生地、聯(lián)系方式(郵編、電話)等。
第一行表述此XML文件的版本是1.0,用的是"GBK"的編碼方式(假如要解析中文,GBK或GB2312是必須的)。、是的子標(biāo)記。而在< Contact>中還可以繼續(xù)包含子標(biāo)記:、。用戶自定義tag的XML語(yǔ)言給了用戶足夠的自由度表示數(shù)據(jù),但是也為顯示和解析帶來(lái)了難度,為了解決這一問(wèn)題,W3C在格式控制和標(biāo)記定義上對(duì)XML加以限制。例如就是一對(duì)不合格的標(biāo)記。
2.2 DTD定義數(shù)據(jù)
DTD(Document Type Definition)目的是定義XML文檔中的元素和各元素間的關(guān)系。DTD可以與應(yīng)用它的XML共存在一個(gè)文件中,也可以單獨(dú)成為一個(gè)文件。例2是一個(gè)描述例1所述的xml文件的DTD文件。

<?xml version="1.0" encoding="GBK"?>
<!ELEMENT Customer
(Name?,Id_No?,Sex?,Birth_Place?,
Birth_Date?,Nationality?, Education?,
Contact_Info?>
<!ATTLIST Customer
Customer_No CDATA #REQUIRED
>
<!ELEMENT Name (#PCDATA)>
<!ELEMENT Id_No (#PCDATA)>
<!ELEMENT Sex (#PCDATA)>
<!ELEMENT Birth_Place (#PCDATA)>
<!ELEMENT Birth_Date (#PCDATA)>
<!ELEMENT Nationality (#PCDATA)>
<!ELEMENT Education (#PCDATA)>
<!ELEMENT Contact_Info
(Zip_Code?,Tel_No?)>
<!ATTLIST Contact_Info
id CDATA #REQUIRED
>
<!ELEMENT Zip_Code (#PCDATA)>
<!ELEMENT Tel_No (#PCDATA)>
 
 
例2:DTD文件
無(wú)規(guī)矩不成方圓,例2的DTD文件定義了例1的XML描述的Customer元素,通過(guò)DTD的定義,XML中的標(biāo)記都被賦予了意義,并且很好的解釋了Customer與其它元素之間的關(guān)系。DTD文件的存在使XML中的數(shù)據(jù)有了規(guī)定的形式,二者由如此緊密地聯(lián)系輕易聯(lián)想到另外一種重要的數(shù)據(jù)組織方式--數(shù)據(jù)庫(kù)的表中的字段和數(shù)據(jù)。
DTD-XML這種與表結(jié)構(gòu)-數(shù)據(jù)類似的結(jié)構(gòu)為這兩種技術(shù)的相互轉(zhuǎn)換提供了天然的方便條件,借助于DTD,可以方便的將表中的數(shù)據(jù)用XML表示。
3、編譯你的Zeus
下載下來(lái)的Zeus是一個(gè)zip文件,假如選擇的是源代碼下載,就必須首先編譯才能夠使用。本文介紹zeus的使用,首先從源代碼的編譯說(shuō)起。
編譯的方法在下載的docs文件夾中有詳盡的描述,作為Java技術(shù)陣營(yíng)的一份子,Zeus在將自己完全奉獻(xiàn)的同時(shí)也使用了其他的一些杰出的Java工具。比如編譯就使用了Apache的Ant。可以在Zeus/lib下找到Ant.jar文件。
在編譯之前唯一要做的事就是設(shè)定好操作系統(tǒng)的JAVA_HOME環(huán)境變量。例如在windows系統(tǒng),假如jdk安裝在D:/jdk1.3.1,則運(yùn)行set JAVA_HOME = D:/jdk1.3.1。
完成了預(yù)備工作就可以開始編譯zeus,Ant本身是易于使用的編譯工具,build.xml文件可以設(shè)定所有編譯的細(xì)節(jié)和文件的組裝。Zeus的編譯文件位于根目錄下的build.xml,這個(gè)XML文件包含了對(duì)Zeus編譯并組裝zeus.jar文件的一切細(xì)節(jié)而且有很高的可讀性。
確定在zeus的根目錄下,運(yùn)行./bin/build.bat targets,Ant可以找到位于當(dāng)前目錄下的build.xml文件,假如不輸入任何參數(shù),ant會(huì)輸出提示要你輸入編譯targets:
compile:編譯zeus的所有源代碼,并將之放置于build/classes下;
bin:將原src/bin下的文件拷到build/bin下,原lib目錄下的jar文件拷到build/lib下并將組合好的zeus.jar置于此文件夾下;
doc:編譯javadoc,并將結(jié)果拷到bin/docs/apidoc/下。
sample和test分別用于編譯例程和測(cè)試代碼。假如不想一步一步編譯,可以將targers參數(shù)設(shè)為all,這樣ant就會(huì)以正確的次序?yàn)槟阕詣?dòng)編譯好所有的targets。編譯后的會(huì)出現(xiàn)一個(gè)build文件夾,所有編譯好的文件都在這個(gè)文件中。
檢查build/bin文件夾,出現(xiàn)的Zeus.jar文件就是編譯好的工具。假如你有足夠的經(jīng)驗(yàn)去修改Zeus的源代碼和build.xml文件,完全可以打造屬于你自己的Zeus。
4、生成描述XML的Java對(duì)象
生成Java對(duì)象的第一步是使用Zeus自動(dòng)生成Java源代碼。使用zeus的批處理文件在build/bin/的zeus.bat,使用語(yǔ)法如下:
 
zeus.bat -constraints=
[-outputDir=]
[-collapseSimpleElements=]
[-ignoreIDAttributes=]
[-javaPackage=]
[-root=]
 
 
將例1的XML文件與Java Objects綁定,第一步要生成Java文件,具體方案就是使用Zeus.jar中的org.enhydra.zeus.util.DTDSourceGenerator,例2中的Customer.dtd文件作為必須的constrains參數(shù)。首先執(zhí)行下列命令:
將Customer文件置于c:/zeus/dtd文件下,建立c:/zeus/zjhsample,執(zhí)行下列命令:

C:/zeus>./build/bin/zeus.bat
-constraints=dtd/Customer.dtd
-outputDir=zjhsample -javaPackage
=com.zjh.zeustest.binding
-collapseSimpleElements=true
 
 
查看

c:/zeus/zjhsample/com/zjh/
zeustest/binding文件夾,
發(fā)現(xiàn)生成了六個(gè)文件:
Customer.java、CustomerImpl.java、
Contact_Info.java、Contact_InfoImpl.java、
CustomerUnmarshaller.java、
Unmarshallable.java。
 
 
生成的類名有規(guī)可循:Customer、Contact_info是DTD文件中非簡(jiǎn)單元素的名稱,Zeus生成與其同名的接口;CustomerImpl、Contact_infoImpl是實(shí)現(xiàn)這兩個(gè)接口的類。CustomerUnmarshaller與Unmarshallable看起來(lái)有些希奇,但也不是憑空而來(lái):Unmarshallable接口繼續(xù)自org.xml.sax.ContentHandler,提供解析XML合法性的接口,所有的ElementImpl類都要繼續(xù)該接口;CustomerUnmarshaller提供反解碼XML的接口,將XML文件輸入,返回Customer對(duì)象。
數(shù)據(jù)綁定的所有秘密都隱藏在這幾個(gè)文件中,可以用任何的文本編輯器對(duì)其進(jìn)行編輯。但是就像程序聲明所述:修改這些程序也許會(huì)導(dǎo)致數(shù)據(jù)綁定操作的失敗。
最后編譯這六個(gè)java文件:javac *.java,生成class文件。這樣,就得到了用于描述XML文件的Java類。
5、Marshal與Unmarshal--XML與JAVA Object的轉(zhuǎn)換
通用的XML文件適合不同技術(shù)平臺(tái)之間的數(shù)據(jù)傳輸,Java對(duì)象可以為Java程序提供更加方便的使用接口,通過(guò)Zeus工具生成的Java Object就像是一座橋梁,將二者緊密地聯(lián)系在一起(見(jiàn)圖1)。它不僅在內(nèi)部構(gòu)建了足夠的用來(lái)描述XML文件各個(gè)元素值的屬性,更提供了可以將Java對(duì)象與XML文件相互轉(zhuǎn)化的接口:Unmarshal和Marshal。
Unmarshal:將XML文件"反解碼"為JavaObject;
Marshal:將JavaObject"解碼"為XML文件。
 
 
教您如何用Zeus實(shí)現(xiàn)XML-Java的數(shù)據(jù)綁定
圖1:Java對(duì)象與XML文件的轉(zhuǎn)換

5.1 Unmarshal XML文件到Java對(duì)象
一旦用Zeus生成的Java對(duì)象被編譯,將XML文件轉(zhuǎn)化為Java形式的表述就變成了一件簡(jiǎn)單且舒服的事。這一過(guò)程被描述為"反解碼(Unmarshal)",其實(shí)它是Zeus根據(jù)DTD文件生成的ElementImp對(duì)象的Unmarshal()方法。
如同科幻小說(shuō)中的物品自動(dòng)制造機(jī),向Unmarshal方法投入以Java File、Writer、或InputStream形式包裝的XML文件,一按Unmarshal按鈕,XML數(shù)據(jù)的Java表示版就輕而易舉的誕生了。示例程序(例3)中的CustomerUnmarshal類完成了Unmarshal例1中customerInfo.xml的工作,并把結(jié)果輸出到屏幕上。

package com.zjh.zeustest;
import java.io.*;
import com.zjh.zeustest.binding.*;
public class CustomerInfo
{
public static void
main(String[] args)
{
if(args.length!=1)
{
System.out.PRintln
("please in put the location of XML file");
return;
}
try{
Customer customer =
CustomerUnmarshaller.unmarshal
((new File(args[0])),false);
System.out.println
("姓名:"+customer.getName());
System.out.println
("證件號(hào)碼:"+customer.getId_No());
System.out.println
("性別:"+customer.getSex());
System.out.println
("出生地:"+customer.getBirth_Place());
System.out.println
("國(guó)籍:"+customer.getNationality());
System.out.println
("學(xué)歷:"+customer.getEducation());
System.out.println
("郵政編碼:"+customer.getContact_Info()
.getZip_Code());
System.out.println
("電話號(hào)碼:"+customer.
getContact_Info().getTel_No());
}catch(Exception e){
e.printStackTrace();
}
}
}
 
 
例3 Unmarshal XML
編譯該程序后用下列命令運(yùn)行:

java -classpath ./;../lib/xerces.jar
com.zjh.zeustest.Customer Unmarshal
../cust.xml
 
 
輸入如下:

姓名:李俊
證件號(hào)碼:210106421016001
性別:男
出生地:大連
國(guó)籍:中 國(guó)
學(xué)歷:高 中
郵政編碼:116001
電話號(hào)碼:2645677
 
 
5.2 Marshal Java對(duì)象到XML文件
把數(shù)據(jù)從Java Object的形式轉(zhuǎn)換為XML文件是Unmarshal的逆過(guò)程,在語(yǔ)義上用的也是Marshal(解碼)這一名詞。下面提供的例子(例4)提供一個(gè)數(shù)據(jù)綁定使用完整的例子:

將Cust.xml讀入
Unmarshal XML
修改Java對(duì)象的屬性值
Marshal Java對(duì)象
package com.zjh.zeustest;
import java.io.*;
import com.zjh.zeustest.binding.*;
public class CustomerMarshal
{
public static void
main(String[] args)
{
if(args.length!=1)
{
System.out.println
("please in put the location of XML file");
return;
}
try{
Customer customer =
CustomerUnmarshaller.unmarshal
((new File(args[0])),false);
Contact_Info contactInfo
= customer.getContact_Info();
contactInfo.setId("0002");
contactInfo.setZip_Code("116001");
contactInfo.setTel_No("6656456");
customer.setBirth_Date("1979-10-1");
customer.setBirth_Place("大連");
customer.setContact_Info(contactInfo);
customer.setCustomer_No("1234566");
customer.setEducation("大學(xué)");
customer.setId_No("210204197910012233");
customer.setName("李明");
customer.setNationality("中國(guó)");
customer.setSex("男");
customer.marshal((new
File("MarshalCust.xml")));
}catch(Exception e){
e.printStackTrace();
}
}
}
 
 
例4 Marshal JavaObject
執(zhí)行該程序后生成的新的MarshalCust.xml如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Customer SYSTEM
"D:/zeus/dtd/Customer.dtd">
<Customer Customer_No="1234566">
<Name>李明</Name>
<Id_No>210204197910012233</Id_No>
<Sex>男</Sex>
<Birth_Place>大連</Birth_Place>
<Birth_Date>1979-10-1</Birth_Date>
<Nationality>中國(guó)</Nationality>
<Education>大學(xué)</Education>
<Contact_Info id="0002">
<Zip_Code>116001</Zip_Code>
<Tel_No>6656456</Tel_No>
</Contact_Info>
</Customer>
 
 
選擇Zeus的理由與思考:
Java與XML是一對(duì)天生的兄弟,在所有計(jì)算機(jī)軟件技術(shù)都高舉XML大旗的時(shí)候,有一萬(wàn)個(gè)理由實(shí)現(xiàn)Java與XML的完美結(jié)合。Sun、Apache也提供了功能強(qiáng)大XML解析包,站在巨人的肩膀上(實(shí)際上Zeus使用了Apache的Xerces來(lái)解析XML),Zeus提出的是數(shù)據(jù)綁定的概念。
從解析到綁定不需要很復(fù)雜的實(shí)現(xiàn)手法,但卻提供給使用者更加簡(jiǎn)單和靈活的解決方案。編程技術(shù)的發(fā)展和開放軟件的出現(xiàn)為創(chuàng)意提供了更廣闊的空間,選擇Zeus,使用Zeus,思考Zeus--沒(méi)有復(fù)雜的技術(shù),只有令人贊嘆的創(chuàng)意。這也許就是后軟件時(shí)代程序生存的真諦,我想。



發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 国产成人在线免费观看视频 | 91精品国产综合久久久欧美 | a级黄色片视频 | 成人在线视频精品 | 精品黑人一区二区三区国语馆 | 久久久久久久免费精品 | 亚洲精品成人18久久久久 | 久草成人在线 | 一级做人爱c黑人影片 | 99精品视频久久精品视频 | 操你视频| 欧美成年性h版影视中文字幕 | 性视频久久 | 亚洲午夜视频在线 | 日本精品免费观看 | 在线观看麻豆 | 国产精品久久久久久久久久久久久久久久 | 国产精品一区二av18款 | 一区二区三区在线观看免费视频 | 欧美成人精品一区二区三区 | 国产成人高清成人av片在线看 | 成年人国产视频 | 日韩视频一区二区三区四区 | 国产精品美女一区二区 | 中文字幕在线观看1 | 国产精品久久久在线观看 | 免费一级毛片免费播放 | 久久99亚洲精品久久99果 | 国产精品亚洲欧美 | 欧美一级高潮 | 成人勉费视频 | 亚洲第一页中文字幕 | 中文字幕在线网 | 国产精品视频久久久 | 中文字幕在线观看网址 | 三级xxxx| 亚洲成人福利在线观看 | 欧美日韩成人一区二区 | 亚洲人成中文字幕在线观看 | 国产精品久久久久久婷婷天堂 | 密室逃脱第一季免费观看完整在线 |