1、服务器端建立
1.1、创建接口
package com.chb.service;
import javax.jws.WebService;
/**
* 1.1、创建接口
*/
public interface IMyService {
public int add(int a, int b);
public int mins(int a, int b);
}
1.2、创建实现类
package com.chb.service;
import javax.jws.WebService;
public class MyServiceImpl implements IMyService{
@Override
public int add(int a, int b) {
System.out.println(a + "+" + b + "=" + (a+b));
return a + b;
}
@Override
public int mins(int a, int b) {
System.out.println(a + "-" + b + "=" +(a-b));
return a - b;
}
}
1.3、开启服务
package com.chb.service;
import javax.xml.ws.Endpoint;
public class MyServer {
public static void main(String[] args) {
//发布的地址
String address = "http://localhost:6666/ns";
Endpoint.publish(address,
new MyServiceImpl());//实现的类
}
1.3.1 启动报错:
报错:Exception in thread "main" java.lang.IllegalArgumentException: class com.chb.service.MyServiceImpl has neither @WebService nor @WebServiceProvider annotation
1.3.2 、关注两个东西
//SEI (Service EndPoint Interface) 服务提供的接口-->IMyService
//SIB (Service implemention Bean) 服务实现的Bean
1.3.3、接口与实现类需要添加下面注解
//接口与实现类需要添加下面注解
@WebService
public interface IMyService {...}
@WebService(endpointInterface="com.chb.service.IMyService")
public class MyServiceImpl implements IMyService{...}
1.3.4、访问 http://localhost:9999/ns?wsdl, 注意后面一定要加?wsdl, 这就是我们公开给网上的某些接口。
1.3.5、我们通过解析这个wsdl, 就可以调用java的方法。不用使用new创建对象。
思考:IMyService iMyService = service.getPort(IMyService.class);
如果别人使用, 也需要有这个接口, 这样就太依赖于这个接口, 不可能别人使用你的服务, 还要寻找你要这个接口, 这样也无法跨平台。
问题: 依赖与IMservice, 需要一种方案: 可以通过wsdl生成本地的类, 生成的类不应该根据服务的平台, 而是根据自己的平台, wsdl可能是java, .net,或其他语言开发的, 我们需要解决这个问题。
2. 解决方案:wsimport的使用就有了接口的类
2.1、新建一个项目,作为客户端,将wsimport生成的目录拷贝到src下, 可以看到生成了很多东西, 有了IMyService接口。
注意上面的MyServiceImplService不是IMyService的实现类, 而是javax.xml.ws.Service的实现类
MyServiceImplService extends Service
2.2、MyServiceImplService提供一个很好的方法供我们获取IMService,
/**
* @return
* returns IMyService
*/
@WebEndpoint(name = "MyServiceImplPort")
public IMyService getMyServiceImplPort() {
return super.getPort(new QName("http://service.chb.com/", "MyServiceImplPort"), IMyService.class);
}
2.3、获取IMyService,调用方法
package com.chb.client;
import com.chb.service.IMyService;
import com.chb.service.MyServiceImplService;
public class TestClient {
public static void main(String[] args) {
MyServiceImplService msis = new MyServiceImplService();
//获取IMyService, 简单多了
IMyService iMyService = msis.getMyServiceImplPort();
System.out.println(iMyService.mins(12, 29));
}
}
3、wsdl到底是什么
3.1、types: 用来定义访问的类型
SOAP (Simple Object Access Protocol), 如何传输SOAP, 就是通过SOAP Message
3.2、Message:SOAP, 请求一个消息, 返回一个消息, 所以要传输的消息两倍与服务提供的方法, 可能更多。
3.3、portType :接下来, 需要指明在服务器端,我们用哪个接口来进行操作。这就需要portType.
3.4、binding:
消息该以什么形式呈献给客户,
有两种方式: style=”document” or style=”rpc”
消息以什么样的形式传递
<soap:body use="literal"/>, 以xml形式传递。
3.5、 servcice : 指定服务所发布的名称