JAX-WS(java api xml webservice)
创建服务器端
1.创建一个接口
IMyService.java
package com.test.service;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
// SEI(Service Endpoint Interface)
@WebService
public interface IMyService {
@WebResult(name = "addResult")
public int add(@WebParam(name = "a") int a, @WebParam(name = "b") int b);
}
2.创建实现接口的类
MyServiceImpl.java
package com.test.service;
import javax.jws.WebService;
// SIB(Service Implemention Bean)
@WebService(endpointInterface = "com.test.service.IMyService")
public class MyServiceImpl implements IMyService {
@Override
public int add(int a, int b) {
return a + b;
}
}
3.开启服务
MyServer.java
package com.test.service;
import javax.xml.ws.Endpoint;
public class MyServer {
public static void main(String[] args) {
String address = "http://localhost:9999/server";
// 发布服务的实现类
Endpoint.publish(address, new MyServiceImpl());
}
}
在浏览器中输入:http://localhost:9999/server?wsdl就可以访问webservice所提供的服务
客户端访问
MyClient.java
package com.test.service;
import java.net.MalformedURLException;
import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
public class MyClient {
public static void main(String[] args) {
try {
// 创建访问wsdl服务地址的url
URL url = new URL("http://localhost:9999/server?wsdl");
// 通过QName指明服务的具体信息
QName qName = new QName("http://service.test.com/", "MyServiceImplService");
// 创建服务
Service service = Service.create(url, qName);
// 实现接口
IMyService ms = service.getPort(IMyService.class);
System.out.println(ms.add(12, 13));
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
}
这里有个问题:service获取实现接口的类时,要依赖于IMyService接口
这里,通过java提供的wsimport命令把wsdl导成.java或.class,就不需要依赖于IMyService接口了,如下图:
-d:指定生成的目录;
-keep:指定是否生成java的源代码,如果没有-keep,只能生成.class二进制文件;
-verbose:显示生成的详细过程;其后跟着网络中wsdl的文件;
-p:指定生成的包;(很少用到);
生成文件如下图:
接着创建独立的java项目,把这些java文件拷贝到src下面,再次创建客户MyClient.java
package com.test.service;
public class MyClient {
public static void main(String[] args) {
MyServiceImplService msis = new MyServiceImplService();
IMyService ms = msis.getMyServiceImplPort();
System.out.println(ms.add(12, 13));
}
}
这个时候service获取实现接口的类时,就不需要依赖于IMyService接口了