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

並且你會發現webapps\axis\WEB-INF\jwsClasses多了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.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來完成轉換,運行上面命令就沒有問題了。

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服務)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM