zoukankan      html  css  js  c++  java
  • 二、用wsdd(Web Services Deployment Descriptor)方式发布WebService

    wsdd方法比jws方法要稍微复杂些,但一定程度上比jws发布的方法要灵活。

    1、首先在AxisWebService工程创建一个java类,里面写简单的2个方法getName、getAge,代码如下:

    代码
    package com.hoo.service;

    /**
    * <b>function:</b>wsdd发布模式的axis WebService
    *
    @author hoojo
    * @createDate Dec 15, 2010 17:24:35 PM
    * @file HelloWorldWSDD.java
    * @package com.hoo.service
    * @project AxisWebService
    * @blog
    http://blog.csdn.net/IBM_hoojo
    * @email hoojo_@126.com
    *
    @version 1.0
    */
    public class HelloWorldWSDD {

    public String getName(String name) {
    return "your name : " + name;
    }

    public int getAge(int age) {
    return age + 10;
    }
    }

    2、如果用wsdd方法首先需要定制我们的wsdd xml文件,这里命名为deploy.wsdd,创建在当前web工程的WEB-INF目录下,代码如下:

    代码
    <?xml version="1.0" encoding="UTF-8"?>
    <deployment xmlns="http://xml.apache.org/axis/wsdd/"
    xmlns:java
    ="http://xml.apache.org/axis/wsdd/providers/java">
    <service name="HelloWorldWSDD" provider="java:RPC">
    <parameter name="className" value="com.hoo.service.HelloWorldWSDD" />
    <!-- * 代表所有的方法都暴露 -->
    <parameter name="allowedMethods" value="*" />
    <parameter name="scope" value="request" />
    </service>
    </deployment>

    service标签代表一个WebService服务,HelloWorldWSDD就是当前WebService的名称;provider是java的WebService类型,分别有: RPC、Document、Wrapped、Message、EJB、RMI;有兴趣的可以看看org.apache.axis.providers.java包下面的WebService的实现类或是文档;

    parameter的参数className代表当前WebService的class类路径;

    allowedMethods代表暴露的方法,那些方法在客户端可以调用;

    <parameter name="scope" value="request" />

    这个是当前WebService的作用域,它有3个值,分别是:request、session、application。

    request代表为每个WebService SOAP的请求都产生一个服务对象,和Spring的scope很像,在服务请求频繁的话会消耗很多资源。

    session 是给每个调用当前WebService的客户端创建一个服务对象

    application 是个当前所有的请求创建一个服务对象

    3、写完配置后,就需要用axis提供的AdminClient工具类帮我们发布WebService,直到生成server-config.wsdd,步骤如下:运行cmd命令,然后进入当前工程发布的目录,即%tomcat_home%/webapps/project/WEB-INF>

    我的是:C:\SoftWare\tomcat-5.0.28\tomcat-5.0.28\webapps\AxisWebService\WEB-INF>

    然后输入命令:java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient deploy.wsdd

    这里的deploy.wsdd是我们刚才定制的wsdd文件,java当然是jvm的命令,-Djava.ext.dirs=lib设置当前命令的依赖包,AdminClient是axis提供的工具类,这个类本来是可以在官方的工程中admin可以直接运行的(这里不可以,下载下来的少了AdminServlet,有兴趣的可以研究下,就是前面说的官方的示例);

    如果运行命令后,看到:

    Processing file deploy.wsdd

    <Admin>Done processing</Admin>

    就代表快成功了,why?快!看看deploy.wsdd同级目录有没有生成server-config.wsdd如果有这个文件就成功了,没有就失败了。如果失败了还有解决办法,首先你得启动tomcat,将我们的工程发布出去。然后在重复上面的命令,不行就换命令行代码如下:

    java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient -lhttp://localhost:8080/AxisWebService/services/AdminService deploy.wsdd

    -lhttp://localhost:8080/AxisWebService/services/AdminService是因为你的端口可能被axis占用了,我们将指定AdminService来完成转换,运行上面命令就没有问题了。

    4、在WebBrowser的地址栏输入:

    http://localhost:8080/AxisWebService/servlet/AxisServlet

    你就可以看到如下效果:

    And now... Some Services

    • HelloWorldWSDD (wsdl)
      • getName
      • getAge
    • AdminService (wsdl)
      • AdminService
    • Version (wsdl)
      • getVersion

    刚才在deploy.wsdd中指定的WebService就在上面出现了,还有暴露出来的方法。点击wsdl就可以看到刚才一样熟悉的wsdl的xml文档。

    5、下面我们编写客户端代码调用上面的WebService,代码块和上面的jws几乎一样,只是参数,方法名称不同。

    代码
    package com.hoo.client;

    import java.rmi.RemoteException;
    import javax.xml.namespace.QName;
    import javax.xml.rpc.ServiceException;
    import org.apache.axis.client.Call;
    import org.apache.axis.client.Service;

    /**
    * <b>function:</b>wsdd 模式的axis WebService客户端
    *
    @author hoojo
    * @createDate Dec 15, 2010 17:30:48 PM
    * @file HelloWorldWSDDClient.java
    * @package com.hoo.client
    * @project AxisWebService
    * @blog
    http://blog.csdn.net/IBM_hoojo
    * @email hoojo_@126.com
    *
    @version 1.0
    */
    public class HelloWorldWSDDClient {

    public static void main(String[] args) throws ServiceException, RemoteException {
    //webService访问地址
    String url = "http://localhost:8080/AxisWebService/services/HelloWorldWSDD";
    //创建服务
    Service service = new Service();
    //创建调用句柄
    Call call = (Call) service.createCall();
    //设置请求地址
    call.setTargetEndpointAddress(url);
    /**
    * 设置调用的方法和方法的命名空间;
    * 当然null也可以,因为本身它就没有设置命名空间,一般方法的命名空间是
    * 包名倒写组成,如com.hoo.service,ns=
    http://service.hoo.com
    */
    call.setOperationName(
    new QName("http://service.hoo.com", "getName"));

    /**
    * 用call调用getName方法,设置请求的参数,返回的就是返回值了
    */
    String result
    = (String) call.invoke(new Object[] { "jack" });
    System.out.println(result);

    call.setOperationName(
    new QName("http://service.hoo.com", "getAge"));

    /**
    * 用call调用getAge方法,设置请求的参数,返回的就是返回值了
    */
    int resultAge = Integer.parseInt(call.invoke(new Object[] { 89 }).toString());
    //服务器端+10
    System.out.println(resultAge);
    }
    }

    运行后结果如下:

    your name : jack

    99

    call.setOperationName(new QName("http://service.hoo.com", "getName"));

    这里设置命名空间,也可以用null代替,但是不能随意设置,有时候会出现异常。

  • 作者:hoojo
    出处:
    blog:http://blog.csdn.net/IBM_hoojo
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权所有,转载请注明出处 本文出自:
分享道版权所有,欢迎转载,转载请注明出处,谢谢
收藏
关注
评论
查看全文
  • 相关阅读:
    Win10设置文件夹权限报错-(提示:无法枚举容器中的对象 访问被拒绝)
    判断上传文件是否是图片文件
    PB调用C#编写的Dll类库
    C#txt文件创建并写入信息
    三十分钟学完Vue
    html增加锚点定位
    Asp.Net WebApi 调试利器“单元测试”
    ios端 返回上一级后 卡在正在加载中处理方式
    [转]如何为图片添加热点链接?(map + area)
    JS获取当前时间并格式化"yyyy-MM-dd HH:mm:ss"
  • 原文地址:https://www.cnblogs.com/hoojo/p/1911363.html
  • Copyright © 2011-2022 走看看