1、webservice概述
WebService是基于xml做消息传输的web应用程序。他支持跨平台,跨语言。既可以用.net实现也可以用java实现。
WSDL:webservice描述语言,使用xml描述对象的函数,参数,返回值,即是机器可以阅读,也是人可以阅读的。
SOAP:简单对象访问协议,webservice就是利用soap,在应用程序之间实现通信。
2、java原生实现代码
这里会建立四个java文件,分别是BaseService.java,BusinessService.java,WSServer.java,WSClient.java,前面两个文件用来建立webservice的接口,后面两个用来测试。
BaseService.java
package com.xxx.webservice;
import javax.jws.WebService;
@WebService
public interface BaseService {
public int add(int a,int b);
public String sayHello(String name);
}
BusinessService.java
package com.xxx.webservice;
import javax.jws.WebService;
@WebService(endpointInterface="com.xxx.webservice.BaseService")
public class BusinessService implements BaseService {
@Override
public int add(int a, int b) {
return a + b ;
}
@Override
public String sayHello(String name) {
return "hello, " + name;
}
}
WSServer.java
package com.xxx.webservice;
import javax.xml.ws.Endpoint;
public class WSServer {
public static void main(String[] args) {
Endpoint.publish("http://localhost:8080/ns", new BusinessService());
System.out.println("webservice publish success.");
}
}
WSClient.java
package com.xxx.webservice;
import java.net.MalformedURLException;
import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
public class WSClient {
public static void main(String[] args) {
try {
URL url = new URL("http://localhost:8080/ns?wsdl");
QName qName = new QName("http://webservice.xxx.com/","BusinessServiceService");
Service service = Service.create(url,qName);
BaseService baseService = service.getPort(BaseService.class);
System.out.println(baseService.add(5, 8));
System.out.println(baseService.sayHello("xxx"));
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
}
3、测试结果及说明
线运行WSServer.java,再运行WSClient.java,结果会先启动webservice,并监听。
等待客户端连接,客户端连接并调用对应的方法,然后返回结果,客户端打印结果。
这里有几个需要注意的问题,第一个是QName qName = new QName("http://webservice.xxx.com","BusinessServiceService");,一个是namespaceURI这个正好是和包名反着的,再一个就是localPart这个参数,默认就是类名+Service,这个可以在启动server端之后,在它发布的服务中可以看到,确实如此命名。
在service.getPort(interface.class)函数中,必须要传入接口,而不能使用实现类。否则会报XXX不是一个interface,如下图: