WebService的调用,一般存在服务端和客户端,由服务端编写接口和实现类,并发布成服务,生成wsdl文件,再由客户端去调用。
接下来按照上述步骤实现jaxws远程调用
1.在服务器端编写接口及实现类
接口:
package com.yonyou.service; public interface QueryData { public String[] query(int num); }
实现类:注意类和方法上的注解即可
package com.yonyou.service.imp; import javax.jws.WebMethod; import javax.jws.WebService; import javax.jws.soap.SOAPBinding; import com.yonyou.service.QueryData; @WebService @SOAPBinding(style = SOAPBinding.Style.RPC) public class QueryDataImp implements QueryData{ @Override @WebMethod public String[] query(int num) { return new String[]{"yy1","yy2","yy3"}; } }
2.发布服务,生成wsdl文件:
提示,可以使用ipconfig查看自己的Ipv4地址 public static void main(String[] args) { String address = "http://10.101.238.173:15008/query"; //发布服务,传入地址和实现类对象 Endpoint.publish(address, new QueryDataImp()); }
打开浏览器,输入http://10.101.238.173:15008/query?wsdl
显示一个xml配置文件的网页,这就是wsdl文件,即webservice description language
1.从该文件的底部找到service节点,它的子节点port name=”QueryDataImpPort” binding=”tns:QueryDataImpPortBinding”
2.根据binding=”tns:QueryDataImpPortBinding”, 找到binding name=”QueryDataImpPortBinding” type=”tns:QueryDataImp”
3.根据type=”tns:QueryDataImp”,找到portType name=”QueryDataImp”,里面有方法名,输入的参数和返回值信息
总结:通过service找binding,通过binding找到portType,然后找到方法信息
在拿到服务端发布的wsdl文件之后,客户端怎么调用呢?
首先打开cmd命令行,cd到客户端项目路径src下
然后通过wsdl文件生成java类
这时候刷新下客户端项目,会出现以下这些类
如果你的jdk是1.6及以下的,有一个类会报错
而注释里也写的很清楚,需要使用wsdl2java命令并加上”-frontend jaxws21”,即:wsdl2java -d . -frontend jaxws21 http://10.101.238.173:15008/query?wsdl
3.在客户端进行调用
public class Client {
public static void main(String[] args) {
//在wsdl中<service name="QueryDataImpService">
QueryDataImpService service = new QueryDataImpService();
//获取Port,也就是<portType name="QueryDataImp">
QueryDataImp query = service.getQueryDataImpPort();
StringArray nameArr = query.query(10);
List<String> names = nameArr.getItem();
if(names != null && names.size() > 0){
for (String name : names) {
System.out.println(name);
}
}
}
}
客户端更为灵活的Service调用
QName两个参数说明:
public static void main(String[] args) throws MalformedURLException {
//wsdl文件地址
URL url = new URL("http://10.101.238.173:15008/query?wsdl");
//namespace和服务类名
QName qName = new QName("http://imp.service.yonyou.com/", "QueryDataImpService");
Service service = Service.create(url, qName);
//获取portType
QueryDataImp query = service.getPort(QueryDataImp.class);
StringArray result = query.query(3);
List<String> item = result.getItem();
for (String ele : item) {
System.out.println(ele);
}
}
运行结果:
yy1 yy2 yy3