乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      Sun eCommunity

       nbtymm 2006-12-01


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

          摘要:本文介紹了怎樣使用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)容重新寫(xiě)到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)

      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ù)格式,撰寫(xiě)相應(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)行畫(huà)面。

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

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

                     

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

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

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

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

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

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

      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ō),可以寫(xiě)一個(gè)專門(mén)用來(lái)設(shè)置環(huán)境變量的執(zhí)行文件。例如,在Windows 上可以寫(xiě)這樣一個(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>表示了畫(huà)布,在畫(huà)布中有各種各樣的形狀,每個(gè)形狀都包含了一些顯示信息,例如x,y坐標(biāo),形狀的類型和顏色等。在應(yīng)用程序中想要操縱此XML文檔,還要根據(jù)這個(gè)XML文檔,產(chǎn)生一個(gè)Schema文檔。例如:(此schema下載

      <xsd:schema xmlns:xsd="http://www./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中組件的代碼。包括畫(huà)布、菜單的初始化,以及各種事件的處理代碼。其中和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主要是畫(huà)布的繪圖操作,包含了鼠標(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)前的位置,畫(huà)筆的當(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)的。例如,在畫(huà)布上有一個(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./webservices/downloads/webservicespack.html

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

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

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

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多