Axis 发布、调用WebService(转)

1、JWS方法发布WebService

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

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

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

二、解压下载的工程或源码(两个中任意一个均可以),解压axis-bin-1.4能够看到大体目录是这样的:apache

clip_image001

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

clip_image002

三、建立webService类文件,代码以下:浏览器

public class HelloWorldService {

public String sayHello(String name) {

return name + ",hello world! ";

}

}

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

image

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

你会看到:session

image

而且你会发现webapps\axis\WEB-INF\jwsClasses多了HelloWorldService.classapp

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就一目了然了。

五、下面编写客户端代码

代码以下:

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工程。

2、搭建本身的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

二、copy了lib下的jar包后,如今要copy下web.xml中的内容,去掉里面的AdminServlet这个配置,其余的均可保留。

image

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

3、用wsdd方式发布WebService

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

一、首先在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;
    }
}

二、若是用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 是个当前全部的请求建立一个服务对象

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

个人是:E:\apache-tomcat-6.0.44\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

执行结果

image

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

四、在WebBrowser的地址栏输入:

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

你就能够看到以下效果:

image

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

五、下面咱们编写客户端代码调用上面的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);
    }
}

4、取消一个发布成功的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

参考文档:

1、搭建简单的axis web服务

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

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

相关文章
相关标签/搜索