1、JAXP(Java API for XML Parsing)
JAXP定義了在Java中使用DOM, SAX, XSLT的通用的接口。這樣在你的程序中你只要使用這些通用的接口,當你需要改變具體的實現時候也不需要修改代碼。比如,你用的XSLT處理器太慢了,你想換一個,你不需要修改你以前的代碼,只要修改一下JAXP的相關配置。(在后面我將詳細地介紹)作為一個共同的接口,JAXP也有所謂的“最小公分母”效應,也就是說它支持的東西很有限。JAXP1.0支持XML1.0,XML Namespace1.0,SAX1.0以及DOM level 1.而JAXP1.1增加了對SAX2.0,DOM level 2以及XSLT1.0的支持。很明顯如果你想使用Xalan的XPath相關的接口,JAXP就沒有支持,你也只能將代碼綁定到特定的Xalan的API上了。
這里還要提一下JDOM,雖然它沒有實現JAXP,但是由于它使用的簡單性,還是很受歡迎,并且成為了JCP正式推薦的API.它也是一種樹狀的結構表現XML,在使用方法上要比w3c的dom標準簡單易用的多。最新版本的JDOM在其內部已經開始使用JAXP的API,它會盡可能的去調用JAXP的API,如果不行就使用自己的默認XML解析器Xerces,XSLT處理器Xalan.
2、JAXB(Java API for XML Binding)
JAXB定義了Java數據對象和xml結構之間的一種雙向映射關系。這樣你就可以很方便地將一個Java對象存儲為一個xml文檔,也可以從一個xml文檔實例化一個Java對象。它的結構是這樣子的:首先要有xml的dtd以及binding schema(這個不是xml的schema,而是一個定義Java對象和xml結構之間映射關系xml文檔),通過這兩個文件JAXB就可以生成與xml文檔結構一致的Java源文件,編譯之后就可以很方便地通過具體的xml文檔得到與xml結構一致的Java類(就是生成的那些類)unmarshalling,反過來marshalling也可以。
它的缺點也很明顯,一旦xml的結構發生了改變,就要重新寫bindng schema以及重新生成編譯Java類。
Sun的動作總是一如既往地慢,在JAXB出臺之前已經有了一些用于xml data binding的框架,我們再來看看同樣也是做xml databinding但是并沒有實現JAXB的框架:
(1)Castor
Castor不僅僅支持對XML的綁定,它還支持對LDAP對象,用OQL將SQL查詢映射為對象,以及對JDO的支持。與JAXB不同的是,它需要的僅僅是xml的Schema.通過xml的Schema來生成相應的Java源代碼,編譯之后就可以marshalling和unmarshalling了。
(2)Zeus
Zeus與Castor和JAXB相比,在class generation方面多做了些步驟,因此它可以支持多種的約束關系,包括對DTD,XML Schema以及TREX等等的支持。不過目前該項目好像已經不做了。
(3)Quick
Quick也是一個非常靈活的框架,詳細的情況可以google一下。
3、JAXM(Java API for XML Messaging)
JAXM是為SOAP通信提供訪問方法和傳輸機制的API.目前它支持SOAP1.1規范以及同步和異步通信。JAXM定義了大量服務,JAXM的實現產品將會提供這些服務,使得開發者不用面對復雜的通信系統。JAXM體系結構中包括兩個重要的組件:JAXM Client和Provider.Client通常是作為J2EE web或EJB容器的一部分,以提供你所寫的程序訪問JAXM服務的能力。而Provider可以以不同的方式實現,主要負責發送和接收SOAP消息。這樣你就可以直接地使用JAXM的API直接發送和接收SOAP消息。
4、JAX-RPC(Java API for XML-RPC)
JAX-RPC是通過xml進行遠程過程調用的Java API.它是基于SOAP技術的,使用SOAP作為底層的協議。這樣對于開發者來說,只有方法,參數,返回值是可見的,而底層的soap通信都被隱藏起來了,開發人員不需要與之直接打交道。
JAXM和JAX-RPC在Web Services方面有很重要的作用。
JDK1.4自帶的是JAXP的參考實現:Crimson的DOM, SAX解析器,Xalan的XSLT處理器。
如果你想用其他的實現替代它們,那就必須了解JAXP框架查找實現的具體步驟:
1、首先,算法會通過諸如javax.xml.transform.TranformerFactory這樣的系統屬性來定位具體實現的類。你可以在命令行中直接指定:
java -Djavax.xml.transform.TransformerFactory=com.foo.ConcreteTransformer YourApp
ConcreteTransformer是實現了TransformerFactory的子類,如果你用的是ant,也可以在build file中指定。
同樣地有,javax.xml.parsers.document.uilderFactory和javax.xml.parsers.SAXBuilderFactory屬性。
2、接著,如果系統屬性中沒有指定,JAXP將會在JRE的目錄中查找lib/jaxp.properties屬性文件,它像一般的properties文件一樣是由name=value組成的,假設有如下的一行:
javax.xml.transform.TransformerFactory=com.foo.ConcreteTransformer
那么JAXP就會使用相應的TransformerFactory實現。
在Java程序中,你可以通過如下的代碼獲得JRE所在的目錄:
String javaHomeDir = System.getProperty("java.home");
不過要注意,如果是在一些IDE中使用,IDE會改變這個java.home的值,比如JBuilder.
3、如果jaxp.properties不存在或者沒有相應的值,那么JAXP將會使用JAR文件的服務提供體制來定位正確的子類。簡單地說,你可以在jar文件的META-INF/services目錄下新建一個名為javax.xml.transform.TransformerFactory的文件,這個文件中只有一行:com.foo.ConcreteTransformer就可以了。
4、最后,如果上面3步都沒有找到任何具體的實現,JAXP就會使用缺省的實現:Crimson和Xalan。
5、JAX-WS(Java API for XML-based Web services)
Web服務已經出現很久了。首先是 SOAP,但 SOAP 僅描述消息的情況,然后是 WSDL,WSDL 并不會告訴您如何使用 Java? 編寫 Web 服務。在這種情況下,JAX-RPC 1.0 應運而生。經過數月使用之后,編寫此規范的 Java Community Process (JCP) 人員認識到需要對其進行一些調整,調整的結果就是 JAX-RPC 1.1。該規范使用大約一年之后,JCP 人員希望構建一個更好的版本:JAX-RPC 2.0。其主要目標是與行業方向保持一致,但行業中不僅只使用 RPC Web 服務,還使用面向消息的 Web 服務。因此從名稱中去掉了“RPC”,取而代之的是“WS”(當然表示的是 Web 服務)。因此 JAX-RPC 1.1 的后續版本是 JAX-WS 2.0——Java API for XML-based Web services。
JAX-WS 仍然支持 SOAP 1.1 over HTTP 1.1,因此互操作性將不會受到影響,仍然可以在網上傳遞相同的消息。
JAX-WS 仍然支持 WSDL 1.1,因此您所學到的有關該規范的知識仍然有用。WSDL 2.0 規范已經接近完成,但在 JAX-WS 2.0 相關工作結束時其工作仍在進行中。
區別何在?
SOAP 1.2
JAX-RPC 和 JAX-WS 都支持 SOAP 1.1。JAX-WS 還支持 SOAP 1.2。
XML/HTTP
WSDL 1.1 規范在 HTTP 綁定中定義,這意味著利用此規范可以在不使用 SOAP 的情況下通過 HTTP 發送 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 服務互操作性組織。)
新 Java 功能
JAX-RPC 映射到 Java 1.4。JAX-WS 映射到 Java 5.0。JAX-WS 依賴于 Java 5.0 中的很多新功能。
Java EE 5 是 J2EE 1.4 的后續版本,添加了對 JAX-WS 的支持,但仍然支持 JAX-RPC,這可能會對 Web 服務新手造成混淆。
數據映射模型
JAX-RPC 具有自己的映射模型,此模型大約涵蓋了所有模式類型中的 90%。它沒有涵蓋的部分映射到了 javax.xml.soap.SOAPElement。
JAX-WS 的數據映射模型是 JAXB。JAXB 可保證所有 XML 模式的映射。
接口映射模型
JAX-WS 的基本接口映射模型與 JAX-RPC 的區別并不大,不過二者之間存在以下差異:
JAX-WS 的模型使用新的 Java 5.0 功能。
JAX-WS 的模型引入了異步功能。
動態編程模型
JAX-WS 的動態客戶機模型與 JAX-RPC 的對應模型差別很大。很多更改都是為了認可行業需求:
引入了面向消息的功能。
引入了動態異步功能。
JAX-WS 還添加了動態服務器模型,而 JAX-RPC 則沒有此模型。
消息傳輸優化機制(Message Transmission Optimization Mechanism,MTOM)
JAX-WS 通過 JAXB 添加了對新附件規范 MTOM 的支持。Microsoft 從來沒有給 SOAP 添加附件規范;但似乎大家都支持 MTOM,因此應該能夠實現附件互操作性。
處理程序模型
從 JAX-RPC 到 JAX-WS 的過程中,處理程序模型發生了很大的變化。
JAX-RPC 處理程序依賴于 SAAJ 1.2。JAX-WS 處理程序依賴于新的 SAAJ 1.3 規范。