Web Service技術,無疑會越來越被廣泛應用的,可以非常好的實現異構應用程序之間的相互通信。JAX-WS是SUN推出的一種實現Web Service的工具。下面是我學習用JAX-WS實現的一個很簡單Web Service例子。
服務端:
新建Java Project
1、 創建服務接口Endpoint
package leon.rpcws.iface;
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.Style;
@WebService
@SOAPBinding(style = Style.RPC)
public interface IHello{
@WebMethod
String sayHello(String name);
}
2、 接口的實現類
package leon.rpcws.impl;
import javax.jws.WebService;
import leon.rpcws.iface.IHello;
@WebService(endpointInterface = "leon.rpcws.iface.IHello")
public class HelloImpl implements IHello {
@Override
public String sayHello(String name) {
return "Hello JAX-WS. Welcome, "+name;
}
}
3、發佈
package leon.rpcws;
import javax.xml.ws.Endpoint;
import leon.rpcws.impl.HelloImpl;
public class HelloPublisher {
public static void main(String[] args) {
Endpoint.publish("http://10.225.112.86:9999/ws/hello", new HelloImpl());
System.out.println("published.");
}
}
以上3個類,就可以完成一個很簡單的Web Service服務端的創建和發佈。運行HelloPublisher,console打印出published.同時紅色方塊亮起,表示發佈成功。
打開瀏覽器,訪問:http://10.225.112.86:9999/ws/hello?wsdl
可以查看到發佈的wsdl文件:
OK,服務端發佈成功。
客戶端:
再新建一個Java Project作爲客戶端
1、 將服務端的IHello接口打成jar包,提供給客戶端工程,本實驗中,我爲了方便,在客戶端創建了包和接口名完全一樣的IHello接口。
2、 創建客戶端調用類
package rpctest;
import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import leon.rpcws.iface.IHello;
public class TestRPC {
public static void main(String[] args) throws Exception {
//1: argument service URI, refer to wsdl document above
//2: argument is service name, refer to wsdl document above
URL url = new URL("http://10.225.112.86:9999/ws/hello?wsdl");
QName qname = new QName("http://impl.rpcws.leon/", "HelloImplService");
Service service = Service.create(url, qname);
IHello hello = service.getPort(IHello.class);
System.out.println(hello.sayHello("Leon Su"));
}
}
控制檯正確的打印出:Hello JAX-WS. Welcome, Leon Su
表示成功了。
另外在JDK6中集成了兩個工具wsgen和import,在JDK根目錄\bin下可以查看到的,這是兩個很有用的工具,可以大大提高開發效率的。下面我們使用wsimport在客戶端生成輔助類來調用服務端的Web Service。
1、新建一個Java Project以後,是一個“空的”的工程,什麼都沒有,我們也不需要服務端給我們提供SEI(Service Endpoint Interface),服務端只需要知道怎麼能訪問到wsdl文件就可以啦。事實上,WS從理論上也是的,客戶端只需要得到服務端的wsdl文件,就足夠調用服務端的WS了。
客戶端訪問服務端的wsdl地址:http://10.225.112.86:9999/ws/hello?wsdl
2、打開Windows的DOS命令行,進入客戶端的根目錄,然後運行一下命令:
wsimport -keep http://10.225.112.86:9999/ws/hello?wsdl
成功執行後,發現他給我們在客戶端工程根目錄下創建了一個leon\rpcws\impl目錄,而且生成了兩個類:HelloImplService.java和IHello.java,將這兩個類源文件剪切到客戶端工程的源文件目錄下(默認src),注意要帶包剪切,也就是說兩個類的包爲:packageleon.rpcws.impl;
這兩個類就是我們訪問服務端WS的輔助類了,現在可以如下訪問了:
package leon.rpcws.test;
import leon.rpcws.impl.HelloImplService;
import leon.rpcws.impl.IHello;
public class HelloClient{
public static void main(String[] args) {
HelloImplService helloService = new HelloImplService();
IHello hello = helloService.getHelloImplPort();
System.out.println(hello.sayHello("Leon Su"));
}
}
服務端的WS發佈啓動,運行這個HelloClient,同樣能成功的調用服務端的WS。
發現,這樣訪問也是很好看的哈!
好了,這就是一個簡單的Web Service,這裏只是同步調用,而且都是Java 類,Java Project。沒有依託Web 容器。
如果要集成到Web 工程,那麼就要添加配置文件,並且有種做法是把Web Service綁定成爲Servlet。