免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
Sun eCommunity


SUN中國(guó)軟件技術(shù)中心      王昱     wang.yu@sun.com

    摘要:本文介紹了怎樣使用JAXB技術(shù)來(lái)快速開(kāi)發(fā)基于XML的應(yīng)用程序,通過(guò)一個(gè)簡(jiǎn)單的二維圖像數(shù)據(jù)存儲(chǔ)的例子,展現(xiàn)了使用XML數(shù)據(jù)表示給應(yīng)用程序帶來(lái)的靈活性,以及怎樣使用JAXB技術(shù)來(lái)簡(jiǎn)化XML操作的復(fù)雜程度。

序言

    我們的一個(gè)合作伙伴,正在使用Java技術(shù)開(kāi)發(fā)專業(yè)領(lǐng)域內(nèi)的CAD二維圖像應(yīng)用軟件。隨著Java技術(shù)的不斷發(fā)展,其虛擬機(jī)的速度不斷的提高,越來(lái)越多的廠商使用Java語(yǔ)言作為他們圖形軟件跨平臺(tái)的解決方案。特別是JDK1.4推出以后,對(duì)圖形圖像的操作,性能有了顯著的提高。在某些二維圖形圖像的類(如VolatileImage)中,能夠直接操縱硬件加速的圖像緩存,甚至使得Java成為圖形游戲的開(kāi)發(fā)平臺(tái)成為可能。

    為了加快開(kāi)發(fā)的速度,我們的合作伙伴選擇了Java本身的對(duì)象序列化(serialization)技術(shù)來(lái)作為應(yīng)用數(shù)據(jù)的存儲(chǔ)。換句話說(shuō),應(yīng)用程序中的所有圖形圖像,不管是按鈕還是線條,都以對(duì)象序列化方式存儲(chǔ)到文件系統(tǒng)中;在使用的時(shí)候,從文件中讀出數(shù)據(jù),恢復(fù)成內(nèi)存中的Java對(duì)象。這樣做的好處是簡(jiǎn)單,所有對(duì)象數(shù)據(jù)的存儲(chǔ)和恢復(fù)都由Java平臺(tái)內(nèi)部的序列化機(jī)制來(lái)完成,數(shù)據(jù)保存的格式(二進(jìn)制)也由Java來(lái)制定;并且在性能上,這種方法也是不錯(cuò)的,特別是在JDK1.4上,對(duì)象序列化的速度有了很大的提高,使得序列化技術(shù)應(yīng)用得越來(lái)越廣泛,不僅僅用于對(duì)象數(shù)據(jù)的存儲(chǔ),還大量的應(yīng)用于各種分布式網(wǎng)絡(luò)計(jì)算模型中。

    但是,我們的合作伙伴在產(chǎn)品開(kāi)發(fā)和版本升級(jí)過(guò)程中遇到了一些問(wèn)題。

l          數(shù)據(jù)的兼容性差
在升級(jí)的版本中,如果對(duì)Java類的改動(dòng)超出了對(duì)象序列化兼容性的范圍,如:改變了類圖結(jié)構(gòu)中的繼承關(guān)系和層次結(jié)構(gòu),改變或增減了類成員變量數(shù)量和類型等等,都會(huì)造成新老版本的數(shù)據(jù)不一致性。很有可能新版本的系統(tǒng)不能兼容和使用老版本系統(tǒng)產(chǎn)生的數(shù)據(jù)。

l          對(duì)數(shù)據(jù)的操作性差。
由于序列化所產(chǎn)生的數(shù)據(jù)是由JVM內(nèi)部機(jī)制生成的二進(jìn)制數(shù)據(jù),對(duì)其進(jìn)行修改和轉(zhuǎn)換有一定的困難和風(fēng)險(xiǎn)。而且二進(jìn)制數(shù)據(jù)的可讀性比較差。而對(duì)這些圖形數(shù)據(jù)的操作是此系統(tǒng)不可缺少的一部分。例如,不同版本之間的數(shù)據(jù)轉(zhuǎn)換,不同格式之間的轉(zhuǎn)換以及系統(tǒng)數(shù)據(jù)的導(dǎo)入和導(dǎo)出,都需要對(duì)系統(tǒng)數(shù)據(jù)進(jìn)行不同程度的操作。

l          數(shù)據(jù)的保存量大。
用序列化保存的數(shù)據(jù)通常包含了大量無(wú)用的信息。例如,保存一個(gè)簡(jiǎn)單的"Button",序列化會(huì)保存它所有父類對(duì)象的所有實(shí)例的成員變量,還會(huì)保存這個(gè)對(duì)象所有缺省的其他屬性。而實(shí)際上,我們只要關(guān)心這個(gè)"Button"上面的文本,加上它在圖面中的坐標(biāo)就行了。要控制序列化保存數(shù)據(jù)量的大小需要較復(fù)雜和繁瑣的設(shè)置,例如使用transit修飾符等等(詳見(jiàn)參考資料)。

l          JDK版本的影響。
不同的JDK的序列化實(shí)現(xiàn)有可能會(huì)有差異,保存數(shù)據(jù)的格式也有所不同,這就使得系統(tǒng)有可能被綁定在某個(gè)版本的JDK,而不能使用高版本的JDK所帶來(lái)的性能上和功能上的好處!       

. XML數(shù)據(jù)表示和JAXB的解決方案

    由于存在以上的問(wèn)題,需要考慮采用其他的解決方案,以保證即能夠保證數(shù)據(jù)操作的靈活性,又能夠使用現(xiàn)有的數(shù)據(jù)格式和成熟的開(kāi)發(fā)工具包,減輕系統(tǒng)開(kāi)發(fā)和維護(hù)的負(fù)擔(dān)。

   XML成為被考慮的目標(biāo)之一。顯然,具有通用數(shù)據(jù)表示之稱的XML能夠帶來(lái)很大的靈活性,使得數(shù)據(jù)在各個(gè)平臺(tái)之間的交換,各個(gè)版本之間的升級(jí)變得非常方便;而且,在XML的開(kāi)發(fā)中,Java平臺(tái)已經(jīng)擁有很多成熟的軟件開(kāi)發(fā)工具和解決方案。一般來(lái)說(shuō),使用XML作為系統(tǒng)數(shù)據(jù)存儲(chǔ)的格式有以下兩種解決方案:

l          直接使用Java對(duì)象序列化的內(nèi)部對(duì)XML的支持功能:XmlEncoderXMLDecoder兩個(gè)類。這個(gè)功能其實(shí)是對(duì)象序列化功能本身的一部分,通過(guò)使用XmlEncoderXMLDecoder這兩個(gè)類,可以使序列化的數(shù)據(jù)以XML的格式保存和恢復(fù),而不是二進(jìn)制格式。這種方式增加了對(duì)數(shù)據(jù)的可讀性和可操作性。但是仍然不能靈活地按照自己的意愿和需求對(duì)數(shù)據(jù)進(jìn)行保存和恢復(fù)。

l          自己定義XML的數(shù)據(jù)格式。這個(gè)方案使系統(tǒng)擁有了最大的靈活程度。一旦使用自己定義的XML格式,那么對(duì)此XML格式的文件進(jìn)行解析、效驗(yàn)以及反向解析(XML文件的生成)都需要自己去開(kāi)發(fā)了!一旦版本發(fā)生更新,XML的數(shù)據(jù)格式也有可能隨著改變,這些解析和效驗(yàn)程序都有可能需要做出相應(yīng)的改動(dòng)。這樣會(huì)大大增加了系統(tǒng)開(kāi)發(fā)的負(fù)擔(dān)和周期!

    JAXB正是為解決這些問(wèn)題而提出來(lái)的。在允許你自己靈活定義自己的 XML文件格式的基礎(chǔ)上,由JAXB替你生成操作XML文件的源代碼,使你的應(yīng)用程序?qū)⒅攸c(diǎn)放到Java對(duì)象上,而不用直接面對(duì)XML操作。這正是JAXB的目的所在。

. JAXB技術(shù)介紹

2.1 .什么是JAXB?

    Java  Architecture for XML Binding (JAXB) 是一個(gè)業(yè)界的標(biāo)準(zhǔn),是一項(xiàng)可以根據(jù)XML Schema產(chǎn)生Java類的技術(shù)。該過(guò)程中,JAXB也提供了將XML實(shí)例文檔反向生成Java對(duì)象樹(shù)的方法,并能將Java對(duì)象樹(shù)的內(nèi)容重新寫到XML實(shí)例文檔。從另一方面來(lái)講,JAXB提供了快速而簡(jiǎn)便的方法將XML模式綁定到Java表示,從而使得Java開(kāi)發(fā)者在Java應(yīng)用程序中能方便地結(jié)合XML數(shù)據(jù)和處理函數(shù)。

    這意味著你不需要處理甚至不需要知道XML編程技巧就能在Java應(yīng)用程序中利用平臺(tái)核心XML數(shù)據(jù)的靈活性。而且,可以充分利用XML的優(yōu)勢(shì)而不用依賴于復(fù)雜的XML處理模型如SAXDOM。JAXB 隱藏了細(xì)節(jié)并且取消了SAXDOM中沒(méi)用的關(guān)系——生成的JAXB類僅描述原始模型中定義的關(guān)系。其結(jié)果是結(jié)合了高度可移植Java代碼和高度可移植的XML數(shù)據(jù)。其中這些代碼可用來(lái)創(chuàng)建靈活、輕便的應(yīng)用程序和Web服務(wù)。

2.2.  JAXB的體系結(jié)構(gòu)


1  JAXB體系結(jié)構(gòu)

      JAXB的體系結(jié)構(gòu)和應(yīng)用過(guò)程如圖1所示,一般來(lái)說(shuō)包含以下幾個(gè)步驟:

l          根據(jù)你的應(yīng)用程序所要操作的XML數(shù)據(jù)格式,撰寫相應(yīng)的XML Schema,有關(guān)XML Schema的知識(shí),請(qǐng)參閱參考資料

l          使用JAXB 所帶的編譯工具(Binding Compiler),將這個(gè)XML Schema文件作為輸入,產(chǎn)生一系列相關(guān)的Java ClassInterface

l          在使用JAXB編譯工具的時(shí)候,可以有選擇性的提供一個(gè)配置文件(圖1的虛線部分),來(lái)控制JAXB編譯工具的一些高級(jí)屬性。

l          這些Java ClassInterface是你的應(yīng)用程序操縱XML數(shù)據(jù)的主要接口和方法。

l          通過(guò)JAXB對(duì)XML文檔進(jìn)行的操作主要包括:將符合XML Schema規(guī)定的XML文檔解析生成一組相應(yīng)的Java對(duì)象;對(duì)這些對(duì)象進(jìn)行操作(修改、增加和刪除對(duì)象的屬性等等);然后將這些對(duì)象的內(nèi)容保存到這個(gè)XML文檔中。

      下面我們結(jié)合本文的示例來(lái)進(jìn)一步說(shuō)明使用JAXB的過(guò)程。

 

. 實(shí)例分析

3.1. 示例運(yùn)行的環(huán)境和步驟

本示例運(yùn)行的Java環(huán)境是JDK1.3.1以上。本示例在Jdk1.4.1運(yùn)行測(cè)試通過(guò)。

l          這里(bin.zip)可以下載已經(jīng)編譯好的可單獨(dú)運(yùn)行的示例程序。

l          展開(kāi)此壓縮文件,在bin目錄下找到可執(zhí)行文件rundemo.batfor windows)或rundemo.sh。 for unix

l          確保環(huán)境變量JAVA_HOME已經(jīng)正確設(shè)置,指向你系統(tǒng)所安裝的JDK的目錄。

l          運(yùn)行rundemo.bat rundemo.sh,就會(huì)出現(xiàn)如下圖所示的運(yùn)行畫面。

3.2. 示例運(yùn)行的場(chǎng)景


2  demo運(yùn)行場(chǎng)景

               

如圖2所示,本示例演示了一個(gè)非常簡(jiǎn)單的場(chǎng)景,它允許你在畫布上使用鼠標(biāo)繪制大小一定的正方形或圓形。

l          你的鼠標(biāo)點(diǎn)到什么位置,就會(huì)在相應(yīng)的位置上繪制圖形。

l          你可以通過(guò)(Color)菜單改變當(dāng)前畫筆的顏色:綠色或紅色。

l          你可以通過(guò)(Graph)菜單改變當(dāng)前圖形的形狀:正方形或圓形。

l          你還可以通過(guò)(File)菜單中的savesave as子菜單將當(dāng)前已經(jīng)繪制的圖形以XML格式保存起來(lái)。

l          你還可以通過(guò)(File)菜單中的open子菜單,選擇以前保存過(guò)的圖形文件,將它顯示在畫布上。

3.3. JAXB使用過(guò)程分析

l          下載JAXB開(kāi)發(fā)工具包

      JAXB1.0 的正式版本的一個(gè)實(shí)現(xiàn)(大家一定要記住,JAXB只是一個(gè)標(biāo)準(zhǔn),Sun公司提供的此工具包只能說(shuō)是這個(gè)標(biāo)準(zhǔn)的一個(gè)實(shí)現(xiàn))已經(jīng)發(fā)布了。由于XMLWeb Services中的大量應(yīng)用,所以,JAXB1.0作為Web Services 開(kāi)發(fā)包的一部分,可以從WSDP1.1 下載。其中jaxb包含在jaxb-1.0子目錄下。

l          設(shè)置環(huán)境變量 

    要使用JAXB,在下載JAXB開(kāi)發(fā)包以后,還要設(shè)置一些環(huán)境變量,主要是設(shè)置classpath的路徑,以提供JAXB包所帶的庫(kù)文件的位置。一般來(lái)說(shuō),可以寫一個(gè)專門用來(lái)設(shè)置環(huán)境變量的執(zhí)行文件。例如,在Windows 上可以寫這樣一個(gè)setenv.bat的文件:

 

set JAVA_HOME=c:\application\java\jdk1.4.1_01
set JWSDP_HOME=c:\application\wsdp1.1
set JAXB_HOME=%JWSDP_HOME%\jaxb-1.0
set JAXB_LIBS=%JAXB_HOME%\lib
set JAXP_LIBS=%JWSDP_HOME%\jaxp-1.2.2\lib
set JWSDP_LIBS=%JWSDP_HOME%\jwsdp-shared\lib

set PATH=%JAXB_HOME%\bin;%JWSDP_HOME%\jwsdpshared\bin;%PATH%

set CLASSPATH=%JAXB_LIBS%\jaxb-api.jar;%JAXB_LIBS%\jaxb-ri.jar;%JAXB_LIBS%\jaxb-xjc.jar;

%JAXB_LIBS%\jaxb-libs.jar;%JAXP_LIBS%\jaxb-api.jar;%JAXP_LIBS%\endorsed\xercesImpl.jar;

%JAXP_LIBS%\endorsed\xalan.jar;%JAXP_LIBS%\endorsed\sax.jar;

%JAXP_LIBS%\endorsed\dom.jar;%JWSDP_LIBS%\jax-qname.jar;%JWSDP_LIBS%\namespace.jar;.

l          確定XML Schema

    要確定XML Schema意味著你要確定一個(gè)規(guī)則,來(lái)約束你的XML文檔,使所有符合這個(gè)規(guī)則的XML文檔看上去都很類似。例如,在這個(gè)例子中,我們希望XML文檔的格式如下:

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<shapeContainer>
        <shape>
              <xposition>185</xposition>
              <yposition>83</yposition>
              <shapename>circle</shapename>
              <shapecolor>red</shapecolor>
        </shape>
        <shape>
              <xposition>169</xposition>
              <yposition>177</yposition>
              <shapename>circle</shapename>
              <shapecolor>green</shapecolor>
        </shape>
        <shape>
              <xposition>358</xposition>
              <yposition>155</yposition>
              <shapename>rect</shapename>
              <shapecolor>green</shapecolor>
        </shape>
</shapeContainer>

    如其意,用不著太多的解釋,大家就能明白上面的XML文檔所包含的意思。<shapeContainer>表示了畫布,在畫布中有各種各樣的形狀,每個(gè)形狀都包含了一些顯示信息,例如x,y坐標(biāo),形狀的類型和顏色等。在應(yīng)用程序中想要操縱此XML文檔,還要根據(jù)這個(gè)XML文檔,產(chǎn)生一個(gè)Schema文檔。例如:(此schema下載

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <xsd:element name="appversion" type="xsd:string"/>
        <xsd:element name="shapeContainer" type="ShapeContainerType"/>
        <xsd:complexType name="ShapeContainerType">
              <xsd:sequence>
                      <xsd:element name="shape" type="ShapeType" minOccurs="1" maxOccurs="unbounded"/>
              </xsd:sequence>
        </xsd:complexType>
        <xsd:complexType name="ShapeType">
              <xsd:sequence>
                    <xsd:element name="xposition" type="xsd:int"/>
                    <xsd:element name="yposition" type="xsd:int"/>
                    <xsd:element name="shapename" type="ShapeNameType"/>
                    <xsd:element name="shapecolor" type="ShapeColorType"/>
              </xsd:sequence>
        </xsd:complexType>
        <xsd:simpleType name="ShapeColorType">
              <xsd:restriction base="xsd:string">
                      <xsd:enumeration value="green"/>
                      <xsd:enumeration value="red"/>
              </xsd:restriction>
        </xsd:simpleType>
        <xsd:simpleType name="ShapeNameType">
              <xsd:restriction base="xsd:string">
                    <xsd:enumeration value="circle"/>
                    <xsd:enumeration value="rect"/>
              </xsd:restriction>
        </xsd:simpleType>
</xsd:schema>

     這個(gè)Schema描述了對(duì)xml文檔的約束。例如,

    <xsd:complexType name="ShapeContainerType">
              <xsd:sequence>
                      <xsd:element name="shape" type="ShapeType" minOccurs="1" maxOccurs="unbounded"/>
              </xsd:sequence>
        </xsd:complexType>

    它規(guī)定了<shapeContainer>這個(gè)節(jié)點(diǎn)內(nèi)可以包含一個(gè)或多個(gè)<shape>的節(jié)點(diǎn)。而  

<xsd:complexType name="ShapeType">
       <xsd:sequence>
                <xsd:element name="xposition" type="xsd:int"/>
                <xsd:element name="yposition" type="xsd:int"/>
          <xsd:element name="shapename" type="ShapeNameType"/>
                <xsd:element name="shapecolor" type="ShapeColorType"/>
          </xsd:sequence>
   </xsd:complexType>

  則規(guī)定了每個(gè)<shape>節(jié)點(diǎn)必須包含x,y坐標(biāo)、形狀類型和顏色等屬性。

  schema的其他部分還規(guī)定了“顏色”屬性由“紅色”和“綠色”組成,形狀“類型屬性”由“圓形”和“方形”組成。 另外,在Schema中還使用了一些專用的描述符,例如“complexType”,“simpleType”,“element”,“sequence”以及大量的 "NameSpace"的知識(shí),我就不一一介紹了,想要詳細(xì)了解XML Schema,請(qǐng)?jiān)L問(wèn)“參考資料”。

Schema和XML文檔之間的關(guān)系,就好象Java中類與實(shí)例的關(guān)系。每個(gè)符合 schema的XML文檔,都是這個(gè)Schema的一個(gè)實(shí)例;而Schema本身是一個(gè)模板,它規(guī)定了XML文檔應(yīng)該是什么樣的。

 

l          使用編譯工具生成相應(yīng)的Java

    有了Schema文件以后,我們就可以利用JAXB工具包,讓它來(lái)替我們生成操縱符合這個(gè)Schema規(guī)定的所有XML實(shí)例文檔的所有Java源代碼。

如果已經(jīng)設(shè)置好了環(huán)境變量的話(請(qǐng)參考設(shè)置環(huán)境變量),那么只需要運(yùn)行JAXB包所帶的xjc運(yùn)行程序,例如

%JAXB_HOME%\bin\xjc.bat demo.xsd -d src -p epri.jaxb

     其中  

u        %JAXB_HOME%是你安裝JAXB工具包的位置,通常在jwsdp工具包的子目錄下。

u        demo.xsd Schema的文件名,一般以xsd作為文件名的后綴。

u        -d  的選項(xiàng),是指定系統(tǒng)生成的Java源代碼所放置的目錄

u        -p  的選項(xiàng),是指定系統(tǒng)生成的Java源代碼所在的Java Package的名稱。

u        還有更多的選項(xiàng),請(qǐng)參考JAXB的相關(guān)文檔。

    如果運(yùn)行成功的話,就會(huì)在你"-d"選項(xiàng)指定的目錄下產(chǎn)生一些java代碼。如果感興趣的話,大家可以查看這些代碼進(jìn)行詳細(xì)的研究。如果你就想知道怎樣使用它們的話,那么只需要簡(jiǎn)單的了解就行了。

l          在應(yīng)用程序中使用這些代碼

    下面我們分析一下如何在我們的應(yīng)用程序中使用JAXB工具包替我們生成的代碼。在我們的實(shí)例中,主要有兩個(gè)Java源文件:JaxbDemoFrame.javaMyCanvas.java。當(dāng)然,大家也可以從此處下載所有的源代碼。

JaxbDemoFrame.java


    JaxbDemoFrame.java
中大部分都是處理Frame中組件的代碼。包括畫布、菜單的初始化,以及各種事件的處理代碼。其中和JAXB有關(guān)的有JAXB初始化代碼:

 126      //init jaxb
 127       try {
 128           JAXBContext jc = JAXBContext.newInstance( "epri.jaxb" );
 129          
 130           ObjectFactory objFactory = new ObjectFactory();
 131           myContainer = objFactory.createShapeContainer();
                       ......
 134           m = jc.createMarshaller();
 135           u = jc.createUnmarshaller();
 136           m.setProperty( Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE );
 137         
 138          
 139       } catch( JAXBException je ) {
 140           je.printStackTrace();
 141       }

    JAXBContext 提供了一個(gè)入口,通過(guò)這個(gè)入口可以管理必要的XML/Java綁定信息??蛻舳藨?yīng)用程序通過(guò)newInstance(contextPath)方法得到該類的新實(shí)例。contextPath 參數(shù)包含一個(gè)或多個(gè)Java包名,這些Java包就是了JAXB編譯器所產(chǎn)生的接口代碼所在的Java包。該參數(shù)值初始化JAXBContext 對(duì)象,使得它能夠管理JAXB編譯器產(chǎn)生的接口;而通過(guò)ObjectFactory,可以直接生成根節(jié)點(diǎn)java對(duì)象ShapeContainer;對(duì)于MarshallerUnmarshaller,這兩個(gè)對(duì)象主要是用于Java對(duì)象和XML文檔互相轉(zhuǎn)換的主要接口(Marshaller負(fù)責(zé)從Java對(duì)象到XML文檔的轉(zhuǎn)換,Unmarshaller負(fù)責(zé)從XML文檔到Java對(duì)象的轉(zhuǎn)換)。

    在打開(kāi)文件的操作代碼中,也有對(duì)JAXB的操作:

150    private void openFile()  {
151        FileDialog open = new FileDialog(this,"open file..",FileDialog.LOAD);
152        open.setVisible(true);
153        filename = open.getDirectory()+open.getFile();
154      try {
155          myContainer  =(ShapeContainer)u.unmarshal( new FileInputStream(filename));
156          this.canvas.setShapeContainer(myContainer);
157          this.canvas.repaint();
158      } catch( JAXBException je ) {
159          je.printStackTrace();
160      } catch (FileNotFoundException fe) {
161          System.out.println("file not found!");
162      }
163    }

Unmarshaller.unmarshal() 的方法可以直接將一個(gè)XML文件里的數(shù)據(jù)轉(zhuǎn)換成Java對(duì)象。此對(duì)象應(yīng)該是整個(gè)java對(duì)象樹(shù)中最靠近根的對(duì)象(在本例中為 ShapeContainer)。其他的對(duì)象都可以通過(guò)這個(gè)根對(duì)象的其他方法進(jìn)一步獲得,下面的章節(jié)會(huì)介紹到。

在文件保存的操作代碼中,也有對(duì)JAXB的操作:

182   private void saveAsFile() {
            ......
187         m.marshal(myContainer, new FileOutputStream(filename));
            ......
193    }

Marshaller.marshal()的方法是將一個(gè)根節(jié)點(diǎn)的Java對(duì)象,連同這個(gè)對(duì)象內(nèi)部所包含的其他所有對(duì)象,都按照Schema的要求將對(duì)象中的內(nèi)容輸出到XML文檔中去。

MyCanvas.java

MyCanvas.java主要是畫布的繪圖操作,包含了鼠標(biāo)事件的響應(yīng)和繪制屏幕的方法中。在MyCanvas.java也有一些代碼使用了JAXB生成的class。

53 public void mousePressed(MouseEvent e) {
        .......

65        java.util.List shapeList = myContainer.getShape();
66        try {
67             ShapeType newType = this.objectFactory.createShapeType();
68            newType.setShapecolor(this.currentColor);
69            newType.setShapename(this.currentgraph);
70            newType.setXposition(this.currentX);
71            newType.setYposition(this.currentY);
72            shapeList.add(newType);

73        } catch( JAXBException je ) {
74            je.printStackTrace();
75        }
76        repaint();
77    }


90  public void paint(Graphics g) {
91        if (myContainer !=null){
92            java.util.List shapeList = myContainer.getShape();
            ......  
           
95            for( Iterator iter = shapeList.iterator(); iter.hasNext(); ) {
96                ShapeType  myshape =  (ShapeType)iter.next();
97                String shapename = myshape.getShapename();
98                String shapeColor = myshape.getShapecolor();
99                int xposition = myshape.getXposition();
100               int yposition = myshape.getYposition();
101              
 if (shapeColor.equals("red"))  g.setColor(Color.red);
102               if (shapeColor.equals("green"))  g.setColor(Color.green);
103               if(shapename.equals("circle")) g.drawOval(xposition-25,yposition-25,50,50);
104                if(shapename.equals("rect")) g.drawRect(xposition-25,yposition-25,50,50);
105                this.setForeground(currentcolor);
106            }
107        }
108    }

在鼠標(biāo)點(diǎn)擊事件的處理中和屏幕繪制的方法中有大量使用JAXB所生成的類的代碼(黑體字所表示的)。 這些代碼比較清楚的表現(xiàn)了怎樣使用JAXB所生成的類。鼠標(biāo)點(diǎn)擊事件的處理中,根據(jù)程序的邏輯,每次鼠標(biāo)的 點(diǎn)擊都應(yīng)該根據(jù)鼠標(biāo)當(dāng)前的位置,畫筆的當(dāng)前顏色和當(dāng)前的形狀,來(lái)創(chuàng)建一個(gè)圖形,并將此圖形添加到整個(gè)對(duì)象樹(shù)中去; 而在屏幕繪制的paint()方法中,應(yīng)用程序遍歷整個(gè)對(duì)象樹(shù),找到每個(gè)圖形的屬性,并將它們繪制在屏幕上。 

JAXB所生成的代碼都有一定的規(guī)律(遵循JAXB標(biāo)準(zhǔn)),這些規(guī)律非常簡(jiǎn)單易用。例如,在Schema中我們規(guī)定了,在ShapeContainer 中允許有一個(gè)或多個(gè)shape節(jié)點(diǎn),那么在生成的ShapeContainer這個(gè)類中就getShape()方法來(lái)返回一個(gè)shape的集合。又比如,在Schema 中我們規(guī)定了每個(gè)shape都有一些屬性(shapename, shapecolor, xposition, yposition)。那么在相應(yīng)的ShapeType的類中,我們就會(huì)看到get和set的一些方法去設(shè)置和獲得這些屬性的值。

. 使用XML和JAXB的優(yōu)勢(shì)

l          簡(jiǎn)單易用。
通過(guò)上面的例子,大家可以發(fā)現(xiàn)所有對(duì)XML文檔的操作都隱藏起來(lái)了,你的應(yīng)用程序不用使用SAXDOM接口編程去操縱XML文檔,使程序量降低,錯(cuò)誤率減少,有助于程序質(zhì)量的提高。

l          維護(hù)性好。
當(dāng)你的產(chǎn)品需要更新,或是數(shù)據(jù)模型需要改變時(shí),只需要重新定義Schema,然后讓JAXB重新生成對(duì)XML文檔進(jìn)行操縱的類,使得你的應(yīng)用程序具有很好的維護(hù)性。

l          數(shù)據(jù)兼容性好。
當(dāng)你進(jìn)行版本更新的時(shí)候,往往要考慮兼容性問(wèn)題。由于你使用了XML作為數(shù)據(jù)交換的格式,只需要提供XSLT的模板就能將原有的數(shù)據(jù)格式自動(dòng)轉(zhuǎn)換成新版本的格式。除此以外,你可以將你的XML表示的圖形數(shù)據(jù)文件任意轉(zhuǎn)換成其他標(biāo)準(zhǔn)的CAD數(shù)據(jù)格式,一切都在你的掌握之中。

l          有較好的性能。
因?yàn)?/span>JAXB在運(yùn)行時(shí)在大部分時(shí)間中都是直接操縱內(nèi)存中的Java對(duì)象,只有在讀取和存儲(chǔ)文件的時(shí)候才會(huì)與XML文件進(jìn)行IO操作,實(shí)質(zhì)上是為XML文件做了一個(gè)緩存,因此運(yùn)行時(shí)的性能很好。

. 使用JAXB的限制

跟直接使用Java對(duì)象序列化相比,JAXB也有它的限制。在使用Java序列化的時(shí)候,Java對(duì)象和XML文檔是直接對(duì)應(yīng)起來(lái)的。例如,在畫布上有一個(gè)java.awt.Button對(duì)象,那么當(dāng)你進(jìn)行序列化的時(shí)候,java.awt.Button的所有數(shù)據(jù)被直接存儲(chǔ)到序列化文件中;在進(jìn)行圖形恢復(fù)的時(shí)候,文件中的序列化數(shù)據(jù)直接就轉(zhuǎn)換成java.awt.Button對(duì)象了。然而在使用JAXB的時(shí)候,由于JAXB沒(méi)有將XML文檔轉(zhuǎn)換成指定的Java類的功能,XML和應(yīng)用程序中間會(huì)多一層。例如,你不能要求JAXBXML文檔數(shù)據(jù)中直接生成java.awt.Button對(duì)象,JAXB在大多數(shù)環(huán)境中只能生成中間進(jìn)行數(shù)據(jù)傳遞的對(duì)象。用java.awt.Button作為例子,使用JAXB,你只能根據(jù)XML中的數(shù)據(jù)生成JAXB特有的MyButton對(duì)象,在再通過(guò)MyButton對(duì)象中的數(shù)據(jù)去初始化java.awt.Button對(duì)象。這種間接的數(shù)據(jù)傳遞所帶來(lái)的負(fù)面影響是使用JAXB的系統(tǒng)會(huì)產(chǎn)生大量傳遞數(shù)據(jù)的中間對(duì)象。雖然說(shuō),由于Java虛擬機(jī)自動(dòng)回收內(nèi)存的特點(diǎn),大量中間對(duì)象的產(chǎn)生有可能在長(zhǎng)時(shí)間運(yùn)行的Server應(yīng)用中降低系統(tǒng)的性能,但是這種數(shù)據(jù)傳遞的方法在許多系統(tǒng)設(shè)計(jì)中都是可行的。

. 總結(jié)

本文通過(guò)一個(gè)簡(jiǎn)單的實(shí)例程序,演示了如何運(yùn)用JAXBXML設(shè)計(jì)開(kāi)發(fā)你的應(yīng)用系統(tǒng),并且分析了JAXB的優(yōu)勢(shì)和劣勢(shì)?,F(xiàn)在JAXB越來(lái)越多的運(yùn)用到各種應(yīng)用程序當(dāng)中,在越來(lái)越多的開(kāi)放源碼的產(chǎn)品都能看到JAXB的影子。尤其是Web ServicesXML的應(yīng)用的迅速發(fā)展,JAXB越來(lái)越受到廣大Java開(kāi)發(fā)人員的重視。

. 參考資料

1.         JAXB開(kāi)發(fā)包下載 http://java.sun.com/webservices/downloads/webservicespack.html

2.         JAXB學(xué)習(xí)文檔 http://java.sun.com/webservices/docs.html

3.         XML Schema資料 http://www.w3.org/XML/Schema

4.         Java對(duì)象序列化文檔 http://java.sun.com/j2se/1.4.1/docs/guide/serialization/index.html

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
使用 WSAD V5.1 中的 JAXB 來(lái)開(kāi)發(fā)企業(yè)應(yīng)用程序(Custom Binding)
Java 中的 XML: 數(shù)據(jù)綁定,第 1 部分:代碼生成方法 — JAXB 及其它
JAXB2.0 使用文檔
jaxb 通過(guò)xml轉(zhuǎn)ava對(duì)象
JAXB(Java Architecture for XML Binding)新手學(xué)習(xí)筆記
WebService CXF學(xué)習(xí)(進(jìn)階篇4):JAXB剖析
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服