在JAX-RPC 1.1中,開發人員需要寫一個介面類Service Endpoint Interface(SEI),在JAX-WS 2.0中,開發人員一上來就可以直接寫自己的實作類別. 通過使用annotations,自動產生SEI和其他一些檔案.這樣有助於開發人員專註於自己想開發的部分,而不必要地分散精力去維護其他的一些附屬檔案.
下面通過一個HelloWorld的例子來看看,JAX-WS 2.0 API的應用過程.程式是用戶端傳給服務端一個名字,經過服務端處理後,返回到用戶端並列印出來.
一. 環境配置.
1. JDK 5.0 下載: http://java.sun.com/j2se/1.5.0/download.jsp
2. Java EE 5.0 App Server.
https://glassfish.dev.java.net/public/downloadsindex.html
本例中測試用了Build 37
下載完畢後請設定一下Path.還有例子中使用的命令對應於Cygwin,如果用Dos或Linux的話,請適當更改相應的形式.
例子中執行中的命令列以E:/jaxws20為基準,在其下面創造相對應的檔案夾.
二.編寫建立服務端
1. 實作類別.
package endpoint;
import javax.jws.WebService;
import javax.jws.WebMethod;
@WebService()
public class HelloWorld{
//the implementation class must have a default public constructor
public HelloWorld() {};
@WebMethod(operationName="sayHello", action="urn:SayHello")
public String sayHello(String name){
return "Hello "+ name + "!";
}
}
請注意實作類別必須標註WebService(),還必須包括一個default public constructor.
2. 編譯實作類別.
編譯前,創造相應檔案夾build/classes/service來儲存class檔案.還請注意命令在同一行.
javac -classpath $GLASSFISH_HOME/lib/javaee.jar -d ./build/classes/service endpoint/HelloWorld.java
3. 產生相應檔案
在E:/jaxws20下,執行下面的命令,注意事先產生/build/generated.
$GLASSFISH_HOME/bin/wsgen.bat-cp ./build/classes/service -keep -d ./build/classes/service -r ./build/generated -wsdl endpoint.HelloWorld
通過這個命令,會產生相對應的WSDL檔案.
4. 打包
4.1 WEB-INF`結構準備
WEB-INF/classes/
WEB-INF/wsdl/
4.2 Web.xml
在WEB-INF/下,編寫下面的檔案.
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:j2ee="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.5"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<description>HelloWorld Service</description>
<display-name>HelloWorldWAR</display-name>
<servlet>
<description>Endpoint for HelloWorld Web Service</description>
<display-name>HelloWorldWebService</display-name>
<servlet-name>HelloWorldPort</servlet-name>
<servlet-class>endpoint.HelloWorld</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>HelloWorldPort</servlet-name>
<url-pattern>/HelloWorldService</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>60</session-timeout>
</session-config>
</web-app>
4.3 拷貝檔案
cp -r build/classes/service/endpoint ./WEB-INF/classes/
cp build/generated/* archive/WEB-INF/wsdl/
4.4打包
jar cvf helloworld-webservice.war WEB-INF/
5. 配置
先啟動伺服器,
asadmin.bat start-domain domain1
配置到伺服器中,
asadmin.bat deploy --user admin --password adminadmin --host localhost --port 4848 --contextroot helloworld-webservice --upload=true --target server helloworld-webservice.war
三. 用戶端
1. 用戶端類.
在client/下,
package client;
import javax.xml.ws.WebServiceRef;
import endpoint.HelloWorldService;
import endpoint.HelloWorld;
public class WSClient{
@WebServiceRef(wsdlLocation=
"http://localhost:8080/helloworld-webservice/HelloWorldService?WSDL")
static HelloWorldService service;
public static void main(String[] args){
try{
WSClient client = new WSClient();
client.callEndpoint(args[0]);
}catch(Exception e){
e.printStackTrace();
}
}
public void callEndpoint(String name){
try{
HelloWorld port = service.getHelloWorldPort();
System.out.println(port.sayHello(name));
}catch(Exception e){
e.printStackTrace();
}
}
}
2. 產生相關檔案
在編譯用戶端類之前, 需要從服務端公開中的WSDL產生相關的檔案.
wsimport.bat -keep -d ./build/classes/client http://localhost:8080/helloworld-webservice/HelloWorldService?WSDL
3. 編譯用戶端類
javac-d ./build/classes/client -classpath $GLASSFISH_HOME/lib/javaee.jar/;$GLASSFISH_HOME/lib/appserv-ws.jar/;./build/classes/client client/WSClient.java
四. 執行
在build/classes/client/下,
appclient.bat -mainclass client.WSClient Duke
你會看到如下反饋
Hello Duke!