JAX-WS一個很簡單的RPC風格的Web Service同步調用

      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.javaIHello.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。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章