zoukankan      html  css  js  c++  java
  • Axis 发布、调用WebService(转)

    Axis 发布、调用WebService(转)

    一、JWS方法发布WebService

    1、在官方网站下载axis的工程(这个等下就有用的)和源码、jar包等,下载地址是:

    http://www.apache.org/dyn/closer.cgi/ws/axis/1_4 选择一个地址即可

    如 http://mirror.bit.edu.cn/apache/axis/axis/java/1.4/axis-bin-1_4.tar.gz

    2、解压下载的工程或源码(两个中任意一个都可以),解压axis-bin-1.4可以看到大致目录是这样的:

    clip_image001

    打开webapps目录就可以看到一个axis的文件夹,这个文件夹里面有WEB-INF文件夹和一些页面,将axis复制到你的tomcat的webapps目录下。然后启动tomcat服务,访问http://localhost:8080/axis/,看到下面的解码就说明部署成功了:

    clip_image002

    3、创建webService类文件,代码如下:

    复制代码
    public class HelloWorldService {
    
    public String sayHello(String name) {
    
    return name + ",hello world! ";
    
    }
    
    }
    复制代码

    4、复制HelloWorldService.java到我们刚才复制的axis文件夹下即可;也就是tomcat下的webapps下的axis下即可,并重命名为HelloWorldService.jws;

    image

    上面的工作完成后,启动tomcat服务器,访问http://localhost:8080/axis/HelloWorldService.jws

    你会看到:

    image

    并且你会发现webappsaxisWEB-INFjwsClasses多了HelloWorldService.class

    image

    如果你和我看到的是一样的,就证明你已经成功的部署了一个axis1.x的webService。然后我们点击下就可以看到wsdl的xml文件了,内容如下:

    复制代码
    <?xml version="1.0" encoding="UTF-8"?>
    <wsdl:definitions targetNamespace="http://localhost:8080/axis/HelloWorldService.jws" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="http://localhost:8080/axis/HelloWorldService.jws" xmlns:intf="http://localhost:8080/axis/HelloWorldService.jws" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <!--WSDL created by Apache Axis version: 1.4
    Built on Apr 22, 2006 (06:55:48 PDT)-->
    
       <wsdl:message name="sayHelloResponse">
    
          <wsdl:part name="sayHelloReturn" type="xsd:string"/>
    
       </wsdl:message>
    
       <wsdl:message name="sayHelloRequest">
    
          <wsdl:part name="name" type="xsd:string"/>
    
       </wsdl:message>
    
       <wsdl:portType name="HelloWorldService">
    
          <wsdl:operation name="sayHello" parameterOrder="name">
    
             <wsdl:input message="impl:sayHelloRequest" name="sayHelloRequest"/>
    
             <wsdl:output message="impl:sayHelloResponse" name="sayHelloResponse"/>
    
          </wsdl:operation>
    
       </wsdl:portType>
    
       <wsdl:binding name="HelloWorldServiceSoapBinding" type="impl:HelloWorldService">
    
          <wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
    
          <wsdl:operation name="sayHello">
    
             <wsdlsoap:operation soapAction=""/>
    
             <wsdl:input name="sayHelloRequest">
    
                <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://DefaultNamespace" use="encoded"/>
    
             </wsdl:input>
    
             <wsdl:output name="sayHelloResponse">
    
                <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://localhost:8080/axis/HelloWorldService.jws" use="encoded"/>
    
             </wsdl:output>
    
          </wsdl:operation>
    
       </wsdl:binding>
    
       <wsdl:service name="HelloWorldServiceService">
    
          <wsdl:port binding="impl:HelloWorldServiceSoapBinding" name="HelloWorldService">
    
             <wsdlsoap:address location="http://localhost:8080/axis/HelloWorldService.jws"/>
    
          </wsdl:port>
    
       </wsdl:service>
    
    </wsdl:definitions>
    复制代码

    说明: 复制java文件并将后缀名改为.jws,要去掉前面的package….如果带包名的话,请求后编译的class将会在包路径下,这样我们在请求当前jws的时候就会出现找不到class,详细的你可以到发布在tomcat下的工程看看WEB-INF目录下的jwsClass就一目了然了。

    5、下面编写客户端代码

    代码如下:

    复制代码
    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;
    
    public class HelloWorldClient {
    
        public static void main(String[] args) throws ServiceException,
                RemoteException {
            // webService访问地址
            String url = "http://localhost:8080/axis/HelloWorldService.jws";
            // 创建服务
            Service service = new Service();
            // 创建调用句柄
            Call call = (Call) service.createCall();
            // 设置请求地址
            call.setTargetEndpointAddress(url);
            /**
             * 设置调用的方法和方法的命名空间; 因为这里是手动发布到webroot目录下的,所以命名空间和请求地址一致
             * 当然null也可以,因为本身它就没有设置命名空间,一般方法的命名空间是
             * 包名倒写组成,如com.hoo.service,ns=http://service.hoo.com
             */
            call.setOperationName(new QName(null, "sayHello"));
            /**
             * 用call调用sayHello方法,设置请求的参数,返回的就是返回值了
             */
            String result = (String) call.invoke(new Object[] { "axis" });
            System.out.println(result);
        }
    }
    复制代码

    分析上面的代码

    url是根据xml文件中的wsdlsoap:address location的信息得到的,

    运行代码,控制台输出:

    axis,hello world!

    至此第一个Web WebService发布调用成功。下面我们搭建我们自己的web工程。

    二、搭建自己的Axis Web工程

    新建 Web工程AxisWebService;创建好工程后,将刚才解压的axis-bin中的lib的jar包copy到当前工程的lib中;

    axis-ant.jar

    axis.jar

    commons-discovery-0.2.jar

    commons-logging-1.0.4.jar

    jaxrpc.jar

    log4j-1.2.8.jar

    saaj.jar

    wsdl4j-1.5.1.jar

    activation-1.1.jar

    mail-1.4.jar

    2、copy了lib下的jar包后,现在要copy下web.xml中的内容,去掉里面的AdminServlet这个配置,其他的都可保留。

    image

    3、像刚才一样,将HelloWorldService.java复制到AxisWebService的webroot目录下,去掉包名,并且修改后缀为 HelloWorldService.jws即可。最后发布当前web工程,访问http://localhost:8080/AxisWebService/HelloWorldService.jws,如果看到和刚才一样的界面,点击链接能看到wsdl的xml就成功了。

    三、用wsdd方式发布WebService

    Wsdd(Web Services Deployment Descriptor)方法比JWS方法要稍微复杂些,但一定程度上比jws发布的方法要灵活。

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

    复制代码
    package com.xqzt.client;
    
    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.xqzt.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>

    我的是:E:apache-tomcat-6.0.44webappsAxisWebServiceWEB-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

    执行结果

    image

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

    4、在WebBrowser的地址栏输入:

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

    你就可以看到如下效果:

    image

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

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

    复制代码
    package com.xqzt.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;
    
    
    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);
        }
    }
    复制代码

    四、取消一个发布成功的Web服务

    首先,取消发布也需要定制wsdd文件,undeploy.wsdd具体格式如下:

    <undeployment xmlns="http://xml.apache.org/axis/wsdd/">
        <service name="HelloWorldWSDD"/>
    </undeployment>

    同样,像上面发布WebService一样,用命令完成。

    命令如下:

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

    键入命令后,回车看到:

    Processing file undeploy.wsdd

    <Admin>Done processing</Admin>

    就代表你取消服务成功了,那样别人就不能访问你的服务了。再在浏览器地址栏输入:

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

    看看是不是刚才发布的服务被成功取消了!

    image

    参考文档:

    一、搭建简单的axis web服务

    二、用wsdd(Web Services Deployment Descriptor)方式发布WebService

    三、取消发布的WebService(删除一个发布成功的Web服务)

     
  • 相关阅读:
    SRM 441(1-250pt, 1-500pt)
    SRM 387(1-250pt)
    SRM 388(1-250pt)
    SRM 389(1-250pt)
    SRM 601(1-250pt,500pt)
    SRM 409(1-250pt, 1-500pt)
    SRM 408(1-250pt, 1-500pt)
    unique() 去重函数
    poj3468(A Simple Problem with Integers)
    HDU1394(Minimum Inversion Number)
  • 原文地址:https://www.cnblogs.com/xuanbjut/p/14287207.html
Copyright © 2011-2022 走看看