簡介
JAX-WS(Java API for XML-Based Web Services),是創(chuàng)建web服務(wù)的Java編程接口,特別是SOAP服務(wù)。是Java XML編程接口之一,是Java SE 和Java EE 平臺的一部分。
JAX-WS 2.0 規(guī)范是代替JAX-RPC 1.0的下一代Web服務(wù)API。JAX-RPC(The Java API for XML Based RPC)是基于XML的RPC(遠(yuǎn)程過程調(diào)用)的Java API。
JAX-WS 2.0 使用JAXB(The Java Architecture for XML Binding)進(jìn)行XML數(shù)據(jù)綁定,所謂綁定就是指XML請求和XML響應(yīng)如何映射成java對象。
參考資源
JAX-WS 2.0參考資源
https://jcp.org/en/jsr/detail?id=224
https://jakarta.ee/specifications/xml-web-services/2.3/
JAX-WS 3.0參考資源
https://jakarta.ee/specifications/xml-web-services/3.0/
JAX-WS 4.0參考資源
https://jakarta.ee/specifications/xml-web-services/4.0/
Jakarta Web Services Metadata
Jakarta Web Services Metadata項目是Jakarta XML Web Services 項目的一部分,它用Java為web 服務(wù)定義了一個編程模型。
代碼庫:https://github.com/jakartaee/jws-api
Jakarta Web Services Metadata 3.0 Specification Document (HTML):
https://jakarta.ee/specifications/web-services-metadata/3.0/ws-metadata-spec-3.0
Jakarta Web Services Metadata 3.0 Javadoc:
https://jakarta.ee/specifications/web-services-metadata/3.0/apidocs/jakarta.jws/module-summary.html
參考實現(xiàn)
舊項目(已經(jīng)歸檔、只讀)
https://javaee.github.io/metro-jax-ws/
https://github.com/javaee/metro-jax-ws
新項目(Jakarta XML Web Services Eclipse 實現(xiàn))
主頁:
https://eclipse-ee4j.github.io/metro-jax-ws/
代碼庫:
https://github.com/eclipse-ee4j/metro-jax-ws
XML web服務(wù)的Eclipse 實現(xiàn)是一個web服務(wù)框架,它為最終用戶和中間件開發(fā)者開發(fā)web服務(wù)解決方案提供了工具和基礎(chǔ)設(shè)施(infrastructure)。
使用XML web服務(wù)的Eclipse 實現(xiàn),客戶端和web有一個大的優(yōu)勢:Java編程語言的平臺無關(guān)性。
Jakarta XML Web Services Eclipse 實現(xiàn)需要的軟件
JRE版本
Java SE 11或以后版本
Ant 版本
Ant 1.10.6或以后版本
servlet容器
在GlassFish v7.x 、Apache Tomcat 10.1.x下測試過
安裝Jakarta XML Web Services Eclipse 實現(xiàn)
下載Jakarta XML Web Services Eclipse實現(xiàn)獨立zip發(fā)布包
打開主頁:https://eclipse-ee4j.github.io/metro-jax-ws/
點擊右側(cè)的Download就可以下載獨立發(fā)布包,例如,下載jaxws-ri-4.0.0.zip。
解壓后的目錄:
bin子目錄下的內(nèi)容:
docs子目錄下的內(nèi)容:
lib子目錄下的內(nèi)容:
samples子目錄下的內(nèi)容:
安裝到Tomcat中
設(shè)置CATALINA_HOME環(huán)境變量,指向Tomcat的安裝目錄,例如:
在cmd窗口,切換到Jakarta XML Web Services Eclipse實現(xiàn)解壓后的目錄,例如:D:\jaxws-ri-4.0.0\jaxws-ri
這個目錄下有build.xml文件:
運行ant install命令。這個命令其實執(zhí)行了兩個大的操作:
- 拷貝Jakarta XML Web Services Eclipse實現(xiàn)lib子目錄下的jar文件到Tomcat安裝目錄下面的/shared/lib子目錄中
- 更新Tomcat安裝目錄下面/conf/catalina.properties文件中的屬性shared.loader,使之等于${catalina.home}/shared/lib/*.jar
build.xml文件片段:
<target name="install" depends="update-catalina-props" description="Install XML-WS RI 4.0.0 jars">
<echo message="Installing XML-WS RI 4.0.0 for ${catalina.home} ..."/>
<mkdir dir="${catalina.lib.home}"/>
<copy toDir="${catalina.lib.home}" overwrite="true">
<fileset dir="${basedir}/lib" includes="*.jar"/>
</copy>
</target>
<target name="update-catalina-props">
<echo message="Backing up ${catalina.home}/conf/catalina.properties..."/>
<copy file="${catalina.home}/conf/catalina.properties" tofile="${catalina.home}/conf/catalina.properties.backup"/>
<echo message="Adding XML-WS RI jars to shared.loader property in ${catalina.home}/conf/catalina.properties..."/>
<replace file="${catalina.home}/conf/catalina.properties" token="shared.loader=" value="shared.loader=$${catalina.home}/shared/lib/*.jar,"/>
</target>
執(zhí)行ant install命令的窗口輸出信息:
Jakarta XML Web Services Eclipse 實現(xiàn)依賴的jar包
https://eclipse-ee4j.github.io/metro-jax-ws/4.0.0/docs/release-documentation.html#jar-dependency
SOAP1.1+HTTP樣例:運行fromjava樣例(來自Jakarta XML Web Services Eclipse實現(xiàn)發(fā)布包)
說明
fromjava這個樣例演示了從一個Java service endpoint的實現(xiàn)開始,如何構(gòu)建、部署、調(diào)用一個簡單的web服務(wù)。其中Java service endpoint的實現(xiàn)使用了Java注釋。
fromjava的目錄結(jié)構(gòu):
服務(wù)實現(xiàn)類只有一個方法addNumbers,輸入兩個整數(shù),返回一個整數(shù),拋出AddNumbersException異常:
運行web服務(wù)有兩種方式:
- 在servlet容器中運行
- 作為一個j2se webservice endpoint運行(不需要servlet容器)
運行方式一:在tomcat容器中運行web服務(wù)
設(shè)置環(huán)境變量JAXWS_HOME指向JAX-WS的安裝目錄
在cmd窗口切換到fromjava的目錄
運行ant clean
運行ant clean的作用是刪掉${build.home}
目錄。其中${build.home}
目錄指向${basedir}/build
,就是fromjava/build
目錄。(其實這個命令不運行也可以,因為下一步運行ant server命令的時候其中含有ant clean的步驟)
運行ant server -Dtomcat=true
運行ant server -Dtomcat=true的作用是構(gòu)建、部署web服務(wù)的WAR包,因為要將web服務(wù)運行在tomcat中,所以加了-Dtomcat=true這個屬性。這個命令做了四個工作:
<target name="server" depends="setup">
<antcall target="clean"/>
<antcall target="build-server-java"/>
<antcall target="create-war"/>
<antcall target="deploy"/>
</target>
運行輸出:
現(xiàn)在fromjava目錄下的文件布局(注:照理${env.AS_HOME}
這個目錄不應(yīng)該生成的,對我們沒有什么用):
D:\JAXWS-RI-4.0.0\JAXWS-RI\SAMPLES\FROMJAVA
│ build.xml
│ Readme.txt
│
├─${env.AS_HOME}
│ └─domains
│ └─domain1
│ └─autodeploy
│ jaxws-fromjava.war
│
├─build
│ ├─classes
│ │ └─fromjava
│ │ └─server
│ │ │ AddNumbersException.class
│ │ │ AddNumbersImpl.class
│ │ │ AddWebservice.class
│ │ │ EndpointStopper$1.class
│ │ │ EndpointStopper.class
│ │ │
│ │ └─jaxws
│ │ AddNumbers.class
│ │ AddNumbers.java
│ │ AddNumbersExceptionBean.class
│ │ AddNumbersExceptionBean.java
│ │ AddNumbersResponse.class
│ │ AddNumbersResponse.java
│ │
│ └─war
│ jaxws-fromjava.war
│
├─etc
│ deploy-targets.xml
│ sun-jaxws.xml
│ web.xml
│
└─src
└─fromjava
├─client
│ AddNumbersClient.java
│
└─server
AddNumbersException.java
AddNumbersImpl.java
AddWebservice.java
EndpointStopper.java
到<tomcat安裝目錄>/webapps
下查看,war包已經(jīng)拷貝過來了:
運行tomcat
因為生成客戶端代碼的時候要訪問web服務(wù)動態(tài)生成的wsdl文件,所以要先啟動tomcat。
到<tomcat安裝目錄>/webapps
下查看,war包已經(jīng)被自動部署了:
部署以后的文件布局:
D:\APACHE-TOMCAT-10.1.13\WEBAPPS\JAXWS-FROMJAVA
├─META-INF
│ MANIFEST.MF
│ war-tracker
│
└─WEB-INF
│ sun-jaxws.xml
│ web.xml
│
└─classes
└─fromjava
└─server
│ AddNumbersException.class
│ AddNumbersImpl.class
│ AddWebservice.class
│ EndpointStopper$1.class
│ EndpointStopper.class
│
└─jaxws
AddNumbers.class
AddNumbers.java
AddNumbersExceptionBean.class
AddNumbersExceptionBean.java
AddNumbersResponse.class
AddNumbersResponse.java
看看wsdl文件能否正常生成
訪問http://localhost:8080/jaxws-fromjava/addnumbers?wsdl
可以看到,正常生成了wsdl文件。生成客戶端代碼的時候,就要訪問這個wsdl的地址。
<?xml version='1.0' encoding='UTF-8'?><!-- Published by XML-WS Runtime (https://github.com/eclipse-ee4j/metro-jax-ws). Runtime's version is XML-WS Runtime 4.0.0 git-revision#129f787. --><!-- Generated by XML-WS Runtime (https://github.com/eclipse-ee4j/metro-jax-ws). Runtime's version is XML-WS Runtime 4.0.0 git-revision#129f787. --><definitions xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsp="http://www.w3.org/ns/ws-policy" xmlns:wsp1_2="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://server.fromjava/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://server.fromjava/" name="AddNumbersImplService">
<types>
<xsd:schema>
<xsd:import namespace="http://server.fromjava/" schemaLocation="http://localhost:8080/jaxws-fromjava/addnumbers?xsd=1"/>
</xsd:schema>
</types>
<message name="addNumbers">
<part name="parameters" element="tns:addNumbers"/>
</message>
<message name="addNumbersResponse">
<part name="parameters" element="tns:addNumbersResponse"/>
</message>
<message name="AddNumbersException">
<part name="fault" element="tns:AddNumbersException"/>
</message>
<portType name="AddNumbersImpl">
<operation name="addNumbers">
<input wsam:Action="http://server.fromjava/AddNumbersImpl/addNumbersRequest" message="tns:addNumbers"/>
<output wsam:Action="http://server.fromjava/AddNumbersImpl/addNumbersResponse" message="tns:addNumbersResponse"/>
<fault message="tns:AddNumbersException" name="AddNumbersException" wsam:Action="http://server.fromjava/AddNumbersImpl/addNumbers/Fault/AddNumbersException"/>
</operation>
</portType>
<binding name="AddNumbersImplPortBinding" type="tns:AddNumbersImpl">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
<operation name="addNumbers">
<soap:operation soapAction=""/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
<fault name="AddNumbersException">
<soap:fault name="AddNumbersException" use="literal"/>
</fault>
</operation>
</binding>
<service name="AddNumbersImplService">
<port name="AddNumbersImplPort" binding="tns:AddNumbersImplPortBinding">
<soap:address location="http://localhost:8080/jaxws-fromjava/addnumbers"/>
</port>
</service>
</definitions>
運行ant clean
運行ant clean:
運行ant client
運行ant client的目的是為了生成客戶端代碼并編譯:
<target name="generate-client" depends="setup">
<wsimport
debug="true"
verbose="${verbose}"
keep="true"
destdir="${build.classes.home}"
package="fromjava.client"
wsdl="http://localhost:8080/jaxws-fromjava/addnumbers?wsdl">
</wsimport>
</target>
<target name="client" depends="generate-client">
<javac
fork="true"
srcdir="${basedir}/src"
destdir="${build.classes.home}"
includes="**/client/**,**/common/**">
<classpath refid="jaxws.classpath"/>
</javac>
</target>
運行后,客戶端代碼布局:
D:\JAXWS-RI-4.0.0\JAXWS-RI\SAMPLES\FROMJAVA\BUILD
├─classes
│ └─fromjava
│ └─client
│ AddNumbers.class
│ AddNumbers.java
│ AddNumbersClient.class
│ AddNumbersException.class
│ AddNumbersException.java
│ AddNumbersException_Exception.class
│ AddNumbersException_Exception.java
│ AddNumbersImpl.class
│ AddNumbersImpl.java
│ AddNumbersImplService.class
│ AddNumbersImplService.java
│ AddNumbersResponse.class
│ AddNumbersResponse.java
│ ObjectFactory.class
│ ObjectFactory.java
│ package-info.class
│ package-info.java
│
└─war
運行ant run
執(zhí)行ant run表示運行客戶端。
<target name="run">
<java fork="true" classname="fromjava.client.AddNumbersClient">
<classpath>
<path refid="jaxws.classpath"/>
<pathelement location="${build.classes.home}"/>
<pathelement location="${basedir}/etc"/>
</classpath>
</java>
</target>
在運行ant run前,啟動Wireshark抓包工具,在環(huán)回接口上抓包,目的是看看調(diào)用web服務(wù)的協(xié)議是否用了SOAP協(xié)議(用http過濾):
計算10+20的請求:
計算10+20的響應(yīng):
計算-10+20的請求:
計算-10+20的響應(yīng):
運行方式二:作為一個j2se webservice endpoint運行(不運行在servlet容器中)
運行ant clean server-j2se
運行ant clean server-j2se生成服務(wù)端代碼,并且用Endpoint API來部署:
<target name="server-j2se" depends="setup">
<antcall target="clean"/>
<antcall target="build-server-java"/>
<echo message="Starting endpoint... To stop: ant server-j2se-stop "/>
<java fork="true" classname="fromjava.server.AddWebservice">
<classpath>
<path refid="jaxws.classpath"/>
<pathelement location="${build.classes.home}"/>
</classpath>
</java>
</target>
生成的文件布局:
D:\JAXWS-RI-4.0.0\JAXWS-RI\SAMPLES\FROMJAVA\BUILD
├─classes
│ └─fromjava
│ └─server
│ │ AddNumbersException.class
│ │ AddNumbersImpl.class
│ │ AddWebservice.class
│ │ EndpointStopper$1.class
│ │ EndpointStopper.class
│ │
│ └─jaxws
│ AddNumbers.class
│ AddNumbers.java
│ AddNumbersExceptionBean.class
│ AddNumbersExceptionBean.java
│ AddNumbersResponse.class
│ AddNumbersResponse.java
│
└─war
訪問http://localhost:8080/jaxws-fromjava/addnumbers?wsdl
可以正常生成wsdl文件:
運行ant clean client run
另外打開一個cmd窗口,運行ant clean client run,目的是在根據(jù)endpoint發(fā)布的wsdl文件生成客戶端代碼、編譯、并且運行。
運行后,客戶端的代碼布局:
D:\JAXWS-RI-4.0.0\JAXWS-RI\SAMPLES\FROMJAVA\BUILD
├─classes
│ └─fromjava
│ └─client
│ AddNumbers.class
│ AddNumbers.java
│ AddNumbersClient.class
│ AddNumbersException.class
│ AddNumbersException.java
│ AddNumbersException_Exception.class
│ AddNumbersException_Exception.java
│ AddNumbersImpl.class
│ AddNumbersImpl.java
│ AddNumbersImplService.class
│ AddNumbersImplService.java
│ AddNumbersResponse.class
│ AddNumbersResponse.java
│ ObjectFactory.class
│ ObjectFactory.java
│ package-info.class
│ package-info.java
│
└─war
運行ant server-j2se-stop,停止web服務(wù)
<target name="server-j2se-stop" depends="setup">
<get src="http://localhost:9090/stop" dest="stop.status"/>
</target>
REST風(fēng)格的web服務(wù)樣例(使用XML/HTTP綁定 )
說明
本樣例來自Jakarta XML Web Services Eclipse實現(xiàn)發(fā)布包中的restful樣例:
這個樣例展示了基于REST風(fēng)格的web服務(wù),利用XML/HTTP綁定。在這種情況下,不需要發(fā)布wsdl文件。
服務(wù)端實現(xiàn)了一個web服務(wù)的Provider:
客戶端訪問web服務(wù),樣例演示了兩種訪問方式:
-
方式一:使用Jakarta XML Web Services Dispatch,利用HTTP GET請求方法,以及Jakarta XML Web Services MessageContext 的屬性 PATH_INFO 和 QUERY_STRING。
-
方式二:使用URLConnection。
-
另外,也可以直接在瀏覽器中訪問,就作為方式三吧。
restful樣例的目錄結(jié)構(gòu):
D:\JAXWS-RI-4.0.0\JAXWS-RI\SAMPLES\RESTFUL
│ build.xml
│ Readme.txt
│
├─etc
│ deploy-targets.xml
│ sun-jaxws.xml
│ web.xml
│
└─src
└─restful
├─client
│ AddNumbersClient.java
│ DispatchAddNumbersClient.java
│
└─server
AddNumbersImpl.java
web服務(wù)需要兩個輸入?yún)?shù),然后求和,將計算結(jié)果返回。
運行服務(wù)端
設(shè)置環(huán)境變量JAXWS_HOME,指向JAX-WS的安裝目錄
在cmd窗口切換到restful的目錄
運行ant clean server -Dtomcat=true
運行ant clean server -Dtomcat=true,其中tomcat=true這個系統(tǒng)屬性表示將服務(wù)端的web服務(wù)部署到tomcat上。
運行輸出信息:
現(xiàn)在restful目錄下的文件布局:
D:\JAXWS-RI-4.0.0\JAXWS-RI\SAMPLES\RESTFUL
│ build.xml
│ Readme.txt
│
├─build
│ ├─classes
│ │ └─restful
│ │ └─server
│ │ AddNumbersImpl.class
│ │
│ └─war
│ jaxws-restful.war
│
├─etc
│ deploy-targets.xml
│ sun-jaxws.xml
│ web.xml
│
└─src
└─restful
├─client
│ AddNumbersClient.java
│ DispatchAddNumbersClient.java
│
└─server
AddNumbersImpl.java
到<tomcat安裝目錄>/webapps下查看,war包已經(jīng)拷貝過來了:
運行tomcat
到<tomcat安裝目錄>/webapps下查看,war包已經(jīng)被自動部署了:
部署以后的文件布局:
D:\APACHE-TOMCAT-10.1.13\WEBAPPS\JAXWS-RESTFUL
├─META-INF
│ MANIFEST.MF
│ war-tracker
│
└─WEB-INF
│ sun-jaxws.xml
│ web.xml
│
└─classes
└─restful
└─server
AddNumbersImpl.class
(客戶端訪問web服務(wù)方式三)直接在瀏覽器中訪問web服務(wù)、抓包分析
直接在瀏覽器中訪問,服務(wù)已經(jīng)正常啟動:
用Wireshark在本地環(huán)回接口上開啟抓http的包,在瀏覽器中重新訪問。
響應(yīng)報文是HTTP/XML形式的:
(客戶端訪問web服務(wù)方式一)在cmd窗口基于Dispatch方式運行客戶端
運行ant clean client run-dispatch:
客戶端運行以后的輸出目錄布局:
D:\JAXWS-RI-4.0.0\JAXWS-RI\SAMPLES\RESTFUL\BUILD
├─classes
│ └─restful
│ └─client
│ AddNumbersClient.class
│ DispatchAddNumbersClient.class
│
└─war
運行客戶端的時候,同步用Wireshark在本地環(huán)回接口抓到的http的包:
請求參數(shù)放在URL的查詢部分::
響應(yīng):
請求參數(shù)放在URL的路徑部分::
響應(yīng):
(客戶端訪問web服務(wù)方式二)在cmd窗口使用URLConnection方式訪問web服務(wù)
運行ant clean client run-url:
客戶端運行以后的輸出目錄布局:
D:\JAXWS-RI-4.0.0\JAXWS-RI\SAMPLES\RESTFUL\BUILD
├─classes
│ └─restful
│ └─client
│ AddNumbersClient.class
│ DispatchAddNumbersClient.class
│
└─war
用WireShark在本地環(huán)回接口上同步抓到的包:
請求參數(shù)放在URL的查詢部分:
響應(yīng):
請求參數(shù)放在URL的路徑中:
響應(yīng):
Jakarta XML Web Services Eclipse實現(xiàn)下載方式二:用maven下載
這種方式不需要安裝Jakarta XML Web Services Eclipse實現(xiàn)單獨的發(fā)布包。
創(chuàng)建一個maven工程,在maven工程的pom.xml文件中增加如下依賴:
<dependencies>
<dependency>
<groupId>jakarta.xml.ws</groupId>
<artifactId>jakarta.xml.ws-api</artifactId>
<version>4.0.0</version>
</dependency>
<dependency>
<groupId>com.sun.xml.ws</groupId>
<artifactId>jaxws-rt</artifactId>
<version>4.0.0</version>
</dependency>
</dependencies>
因為將web服務(wù)部署servlet容器(例如tomcat)的時候,依賴的包是放在一個目錄下面的。所以,要部署的時候,可以先使用maven的dependency插件,將項目依賴從maven倉庫中提取出來,拷貝到一個指定的位置(如果使用ant構(gòu)建的話,方便ant的build文件編寫)。文章來源:http://www.zghlxwxcb.cn/news/detail-714796.html
例如,在cmd窗口,切換到maven工程的根目錄下面,運行mvn dependency:copy-dependencies -Dmdep.stripVersion=true -DoutputDirectory=lib
,指定將依賴包拷貝到項目根目錄下面的lib子目錄下,拷貝時去掉了依賴包文件名中的版本號:
到<項目根目錄>/lib
子目錄下查看,內(nèi)容拷貝過來了:文章來源地址http://www.zghlxwxcb.cn/news/detail-714796.html
到了這里,關(guān)于基于XML的Web服務(wù)Java接口(JAX-WS)、Jakarta XML Web Services Eclipse 實現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!