JAXB、JAXP、JAXM、JAX-WS

1、JAXP(Java API for XML Parsing)


JAXP定義了在Java中使用DOM, SAX, XSLT的通用的接口。這樣在你的程序中你只要使用這些通用的接口,當(dāng)你需要改變具體的實現(xiàn)時候也不需要修改代碼。比如,你用的XSLT處理器太慢了,你想換一個,你不需要修改你以前的代碼,只要修改一下JAXP的相關(guān)配置。(在后面我將詳細(xì)地介紹)作為一個共同的接口,JAXP也有所謂的“最小公分母”效應(yīng),也就是說它支持的東西很有限。JAXP1.0支持XML1.0,XML Namespace1.0,SAX1.0以及DOM level 1.而JAXP1.1增加了對SAX2.0,DOM level 2以及XSLT1.0的支持。很明顯如果你想使用Xalan的XPath相關(guān)的接口,JAXP就沒有支持,你也只能將代碼綁定到特定的Xalan的API上了。

這里還要提一下JDOM,雖然它沒有實現(xiàn)JAXP,但是由于它使用的簡單性,還是很受歡迎,并且成為了JCP正式推薦的API.它也是一種樹狀的結(jié)構(gòu)表現(xiàn)XML,在使用方法上要比w3c的dom標(biāo)準(zhǔn)簡單易用的多。最新版本的JDOM在其內(nèi)部已經(jīng)開始使用JAXP的API,它會盡可能的去調(diào)用JAXP的API,如果不行就使用自己的默認(rèn)XML解析器Xerces,XSLT處理器Xalan.

2、JAXB(Java API for XML Binding)


JAXB定義了Java數(shù)據(jù)對象和xml結(jié)構(gòu)之間的一種雙向映射關(guān)系。這樣你就可以很方便地將一個Java對象存儲為一個xml文檔,也可以從一個xml文檔實例化一個Java對象。它的結(jié)構(gòu)是這樣子的:首先要有xml的dtd以及binding schema(這個不是xml的schema,而是一個定義Java對象和xml結(jié)構(gòu)之間映射關(guān)系xml文檔),通過這兩個文件JAXB就可以生成與xml文檔結(jié)構(gòu)一致的Java源文件,編譯之后就可以很方便地通過具體的xml文檔得到與xml結(jié)構(gòu)一致的Java類(就是生成的那些類)unmarshalling,反過來marshalling也可以。
  它的缺點也很明顯,一旦xml的結(jié)構(gòu)發(fā)生了改變,就要重新寫bindng schema以及重新生成編譯Java類。
  Sun的動作總是一如既往地慢,在JAXB出臺之前已經(jīng)有了一些用于xml data binding的框架,我們再來看看同樣也是做xml databinding但是并沒有實現(xiàn)JAXB的框架:
  (1)Castor
  Castor不僅僅支持對XML的綁定,它還支持對LDAP對象,用OQL將SQL查詢映射為對象,以及對JDO的支持。與JAXB不同的是,它需要的僅僅是xml的Schema.通過xml的Schema來生成相應(yīng)的Java源代碼,編譯之后就可以marshalling和unmarshalling了。
  (2)Zeus
  Zeus與Castor和JAXB相比,在class generation方面多做了些步驟,因此它可以支持多種的約束關(guān)系,包括對DTD,XML Schema以及TREX等等的支持。不過目前該項目好像已經(jīng)不做了。
  (3)Quick
  Quick也是一個非常靈活的框架,詳細(xì)的情況可以google一下。

3、JAXM(Java API for XML Messaging)


JAXM是為SOAP通信提供訪問方法和傳輸機(jī)制的API.目前它支持SOAP1.1規(guī)范以及同步和異步通信。JAXM定義了大量服務(wù),JAXM的實現(xiàn)產(chǎn)品將會提供這些服務(wù),使得開發(fā)者不用面對復(fù)雜的通信系統(tǒng)。JAXM體系結(jié)構(gòu)中包括兩個重要的組件:JAXM Client和Provider.Client通常是作為J2EE web或EJB容器的一部分,以提供你所寫的程序訪問JAXM服務(wù)的能力。而Provider可以以不同的方式實現(xiàn),主要負(fù)責(zé)發(fā)送和接收SOAP消息。這樣你就可以直接地使用JAXM的API直接發(fā)送和接收SOAP消息。

4、JAX-RPC(Java API for XML-RPC)


JAX-RPC是通過xml進(jìn)行遠(yuǎn)程過程調(diào)用的Java API.它是基于SOAP技術(shù)的,使用SOAP作為底層的協(xié)議。這樣對于開發(fā)者來說,只有方法,參數(shù),返回值是可見的,而底層的soap通信都被隱藏起來了,開發(fā)人員不需要與之直接打交道。
  JAXM和JAX-RPC在Web Services方面有很重要的作用。
  JDK1.4自帶的是JAXP的參考實現(xiàn):Crimson的DOM, SAX解析器,Xalan的XSLT處理器。
  如果你想用其他的實現(xiàn)替代它們,那就必須了解JAXP框架查找實現(xiàn)的具體步驟:
  1、首先,算法會通過諸如javax.xml.transform.TranformerFactory這樣的系統(tǒng)屬性來定位具體實現(xiàn)的類。你可以在命令行中直接指定:
  java -Djavax.xml.transform.TransformerFactory=com.foo.ConcreteTransformer YourApp
  ConcreteTransformer是實現(xiàn)了TransformerFactory的子類,如果你用的是ant,也可以在build file中指定。
  同樣地有,javax.xml.parsers.document.uilderFactory和javax.xml.parsers.SAXBuilderFactory屬性。
  2、接著,如果系統(tǒng)屬性中沒有指定,JAXP將會在JRE的目錄中查找lib/jaxp.properties屬性文件,它像一般的properties文件一樣是由name=value組成的,假設(shè)有如下的一行:
  javax.xml.transform.TransformerFactory=com.foo.ConcreteTransformer
  那么JAXP就會使用相應(yīng)的TransformerFactory實現(xiàn)。
  在Java程序中,你可以通過如下的代碼獲得JRE所在的目錄:
  String javaHomeDir = System.getProperty("java.home");
  不過要注意,如果是在一些IDE中使用,IDE會改變這個java.home的值,比如JBuilder.
  3、如果jaxp.properties不存在或者沒有相應(yīng)的值,那么JAXP將會使用JAR文件的服務(wù)提供體制來定位正確的子類。簡單地說,你可以在jar文件的META-INF/services目錄下新建一個名為javax.xml.transform.TransformerFactory的文件,這個文件中只有一行:com.foo.ConcreteTransformer就可以了。
  4、最后,如果上面3步都沒有找到任何具體的實現(xiàn),JAXP就會使用缺省的實現(xiàn):Crimson和Xalan。

5、JAX-WS(Java API for XML-based Web services)


Web服務(wù)已經(jīng)出現(xiàn)很久了。首先是 SOAP,但 SOAP 僅描述消息的情況,然后是 WSDL,WSDL 并不會告訴您如何使用 Java? 編寫 Web 服務(wù)。在這種情況下,JAX-RPC 1.0 應(yīng)運而生。經(jīng)過數(shù)月使用之后,編寫此規(guī)范的 Java Community Process (JCP) 人員認(rèn)識到需要對其進(jìn)行一些調(diào)整,調(diào)整的結(jié)果就是 JAX-RPC 1.1。該規(guī)范使用大約一年之后,JCP 人員希望構(gòu)建一個更好的版本:JAX-RPC 2.0。其主要目標(biāo)是與行業(yè)方向保持一致,但行業(yè)中不僅只使用 RPC Web 服務(wù),還使用面向消息的 Web 服務(wù)。因此從名稱中去掉了“RPC”,取而代之的是“WS”(當(dāng)然表示的是 Web 服務(wù))。因此 JAX-RPC 1.1 的后續(xù)版本是 JAX-WS 2.0——Java API for XML-based Web services。
  JAX-WS 仍然支持 SOAP 1.1 over HTTP 1.1,因此互操作性將不會受到影響,仍然可以在網(wǎng)上傳遞相同的消息。
  JAX-WS 仍然支持 WSDL 1.1,因此您所學(xué)到的有關(guān)該規(guī)范的知識仍然有用。WSDL 2.0 規(guī)范已經(jīng)接近完成,但在 JAX-WS 2.0 相關(guān)工作結(jié)束時其工作仍在進(jìn)行中。
  區(qū)別何在?
SOAP 1.2
JAX-RPC 和 JAX-WS 都支持 SOAP 1.1。JAX-WS 還支持 SOAP 1.2。
XML/HTTP
WSDL 1.1 規(guī)范在 HTTP 綁定中定義,這意味著利用此規(guī)范可以在不使用 SOAP 的情況下通過 HTTP 發(fā)送 XML 消息。JAX-RPC 忽略了 HTTP 綁定。而 JAX-WS 添加了對其的支持。
WS-I Basic Profile
JAX-RPC 支持 WS-I Basic Profile (BP) V1.0。JAX-WS 支持 BP 1.1。(WS-I 即 Web 服務(wù)互操作性組織。)
新 Java 功能
JAX-RPC 映射到 Java 1.4。JAX-WS 映射到 Java 5.0。JAX-WS 依賴于 Java 5.0 中的很多新功能。
Java EE 5 是 J2EE 1.4 的后續(xù)版本,添加了對 JAX-WS 的支持,但仍然支持 JAX-RPC,這可能會對 Web 服務(wù)新手造成混淆。
數(shù)據(jù)映射模型
JAX-RPC 具有自己的映射模型,此模型大約涵蓋了所有模式類型中的 90%。它沒有涵蓋的部分映射到了 javax.xml.soap.SOAPElement。
JAX-WS 的數(shù)據(jù)映射模型是 JAXB。JAXB 可保證所有 XML 模式的映射。
接口映射模型
JAX-WS 的基本接口映射模型與 JAX-RPC 的區(qū)別并不大,不過二者之間存在以下差異:
JAX-WS 的模型使用新的 Java 5.0 功能。
JAX-WS 的模型引入了異步功能。
動態(tài)編程模型
JAX-WS 的動態(tài)客戶機(jī)模型與 JAX-RPC 的對應(yīng)模型差別很大。很多更改都是為了認(rèn)可行業(yè)需求:
引入了面向消息的功能。
引入了動態(tài)異步功能。
JAX-WS 還添加了動態(tài)服務(wù)器模型,而 JAX-RPC 則沒有此模型。
消息傳輸優(yōu)化機(jī)制(Message Transmission Optimization Mechanism,MTOM)
JAX-WS 通過 JAXB 添加了對新附件規(guī)范 MTOM 的支持。Microsoft 從來沒有給 SOAP 添加附件規(guī)范;但似乎大家都支持 MTOM,因此應(yīng)該能夠?qū)崿F(xiàn)附件互操作性。
處理程序模型
從 JAX-RPC 到 JAX-WS 的過程中,處理程序模型發(fā)生了很大的變化。
JAX-RPC 處理程序依賴于 SAAJ 1.2。JAX-WS 處理程序依賴于新的 SAAJ 1.3 規(guī)范。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,908評論 6 541
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,324評論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,018評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,675評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 72,417評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,783評論 1 329
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,779評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,960評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,522評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,267評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,471評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,009評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,698評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,099評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,386評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,204評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,436評論 2 378

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,823評論 18 139
  • Web 服務(wù)已經(jīng)出現(xiàn)很久了。首先是 SOAP,但 SOAP 僅描述消息的情況,然后是 WSDL,WSDL 并不會告...
    Slahser2c閱讀 788評論 0 1
  • title: Java EE 7 Tutorial分析date: 2016-12-10 16:47:25catag...
    raincoffee閱讀 1,898評論 2 2
  • 寫下的bug犯過的錯 get的結(jié)push的果 人生好像git提交merge的那樣機(jī)械 生活好像是vscode插件的...
    __Seve閱讀 703評論 0 0
  • 今天分享的彼得·蒂爾的《從0到1》原本是一本講創(chuàng)業(yè)的書,可深讀起來,也對個人成長有一定指導(dǎo)意義。其中有幾點印象深刻...
    楊拾一閱讀 213評論 1 4