WebService技术总结(一):jdk自带的WebService API:jaxws

来源:互联网 发布:大富翁3.4棋牌源码 编辑:程序博客网 时间:2024/04/30 15:32

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);        }    }

运行结果:

yy1yy2yy3
0 0
原创粉丝点击