相关的包有:
javax.jws
javax.jws.soap
javax.xml.ws
javax.xml.ws.handler
javax.xml.ws.handler.soap
javax.xml.ws.http
javax.xml.ws.spi
相关术语:
SEI:Service Endpoint Interface
SIB:Service Implementation Bean
发布Web Service服务
服务接口(SEI):
package study.ws.jdk;
import javax.jws.WebService;
@WebService
public interface IMyService {
int add(int a, int b);
int minus(int a, int b);
}
服务实现(SIB):
package study.ws.jdk;
import javax.jws.WebService;
@WebService(endpointInterface="study.ws.jdk.IMyService")
public class MyServiceImpl implements IMyService {
@Override
public int add(int a, int b) {
return a + b;
}
@Override
public int minus(int a, int b) {
return a - b;
}
}
发布服务:
package study.ws.jdk;
import javax.xml.ws.Endpoint;
public class MyServer {
public static void main(String[] args) {
String address = "http://localhost:8888/ws/test";
Endpoint.publish(address, new MyServiceImpl());
}
}
之后就可以通过地址访问:
http://localhost:8888/ws/test
http://localhost:8888/ws/test?wsdl
调用服务
package study.ws.jdk;
import java.net.MalformedURLException;
import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
public class TestClient {
public static void main(String[] args) {
try {
URL url = new URL("http://localhost:8888/ws/test?wsdl");
QName qname = new QName("http://jdk.ws.study/", "MyServiceImplService");
Service service = Service.create(url, qname);
IMyService ms = service.getPort(IMyService.class);
System.out.println(ms.add(9, 990));
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
}
QName中的两个参数:
namespaceURI,localPart
与wsdl中根标签
<definitions targetNamespace="http://jdk.ws.study/" name="MyServiceImplService">
的targetNamespace,name分别对应
但是这种调用依赖接口IMyService,这样客户端必须有些接口,
java中提供了wsimport命令,可以根据wsdl地址生成服务接口及相关类
wsimport -d <文件生成的目录> -p <包名> -keep -verbose http://localhost:8888/ws/test?wsdl
-keep指定同时生成java文件
-verbose指定控制台上显示详细输出信息
比较不错的WebService介绍及框架
http://blog.csdn.net/zolalad/article/details/25158995