Axis1.4框架 實現webservice服務器和客戶端


一:軟件環境

  1. win7旗艦版, Eclipse,JDK1.6,tomcat6.0,Axis1.4的包。 至於Axis1.4包網上可以下載,如果是在找不到可以留言給我。

二:摘要

將解壓后的 axis-1_4\webapps\下的axis 目錄考到 %TOMCAT_HOME%/Webapps/ 目錄下
啟動tomcat后在瀏覽器里輸入 http://localhost:8080/axis 會看到下圖所示

點擊上圖中的 鏈接,頁面上會提示已經有的包和缺少的包的信息,根據提示將必須的包下載全,將這些類包復制到 %tomcathome%/webapps/axis/WEB-INF/lib/目錄下重新啟動tomcat,直到Validation頁面中看不到有Error與Warning的提示信息。

Axis支持三種web service的客戶端訪問方式,分別為:

    • Dynamic Invocation Interface ( DII)
    • Dynamic Proxy方式
    • Stubs方式

PS:看到很多資料將上述方式列為Web Servcie的三種“部署和開發方法,個人覺得有些欠妥

下面介紹axis部署和發布web service的方式:

    • JWS  - 即時發布
    • WSDD  –定制發布

三:JWS --即時發布

 JWS(Java WebService)是最簡單的一種方式。Axis允許把普通Java類的源文件的擴展名改為.jws,然后把它簡單的copy到AXIS_HOME下。這樣,Axis 會自動編譯.jws文件,
 並把它自動加入到Java Web Servie的服務中。非常簡單和靈活,但是這種方式的缺點是:只能是java源代碼,同時類中不能含有包名。具體過程如下

1. 用Eclipse或者文本編輯器編寫一個java類 SayHello.java(此類不含包名)

 public class SayHello {
     public String sayMsg(String name){
         return "Hello: "+name;
     }
 }

  2. 將上面的類(SayHello.java)copy到 %tomcat_home%/webapps/axis/ 目錄下,只需要把類的源文件(不是class)到這個目錄下,重命名為:SayHello.jws

3. 打開瀏覽器輸入: http://localhost:8080/axis/SayHello.jws 會看到:

點擊上圖  Click to see the WSDL 的鏈接,就可以看到生成的wsdl。

4. 使用 Dynamic Invocation Interface ( DII) 方式訪問客戶端 實現如下:

package client;

import org.apache.axis.client.Call;
import org.apache.axis.client.Service;

public class TestClient {

    /**
     * @see axis框架實現簡單的 webService客戶端, 讀webServicez服務器內容,如果有問題請留言
     * @param webUrl 設置調用的wsdl路徑, 即訪問的路徑
     * @param method 設置調用的方法名
     * @param parameters 設置調用的方法的參數
     * @author 鄧龍勝(微信simpledls)
     * @throws Exception
     */
    public static void readerWebserviceContent(String webUrl,String method,Object[] parameters) throws Exception {
        
        Service service = new Service();
        Call call = (Call) service.createCall();
        // 這里是要調用的方法名
        call.setOperationName(method);
        // 設置調用的wsdl路徑, 即訪問的路徑
        call.setTargetEndpointAddress(webUrl);
        // parameters 是為方法傳遞參數, 必須和調用的方法體的參數類型和數量一致
        String val = (String) call.invoke(parameters);
        System.out.println("這是webservice服務器返回的信息:\n" + val);
    }
    
    
    /**
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {
        String webUrl = "http://192.168.1.121:8080/axis/SayHello.jws";
        String method = "sayMsg";
        Object[] parameters= new Object[] { "axis web service" };
        TestClient.readerWebserviceContent(webUrl, method, parameters);
    }
}

 

四:WSDD(Web Service Deployment Descriptor)文件發布Web Service

  1. 為了使大家懂的如何映射實體類,故下文我將用 實體類(javaBean) 作為參數的方式引導大家,那么先在項目中新建一個JavaBean: UserBean.java 代碼如下:
package wsaxis.bean;

public class UserBean {
    
    private String userName; //姓名
    private Integer age;     //年齡
 
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    } 
}

2. 創建一個 MessageService.java 類, 代碼如下:

package wsaxis;

import wsaxis.bean.UserBean;

public class MessageService {
     /**
     * UserBean 作為參數*/
    public String getBeanStr(UserBean bean) {
        return "You Name:" + bean.getUserName() + " , You Age:" + bean.getAge();
    }
}

3. 創建一個 deploy.wsdd 文件, 該文件主要用於生成發布文件 server-config.wsdd ,  在項目中依次點擊: new --> other -->file  內容如下:

<deployment name="test" xmlns="http://xml.apache.org/axis/wsdd/"
    xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
  <service name="MessageService" provider="java:RPC" style="rpc" use="encoded">
    <parameter name="className" value="wsaxis.MessageService"/>
    <parameter name="allowedMethods" value="*"/>
         <typeMapping xmlns:ns1="http://wsaxis.michael.com" qname="ns1:userBean"
             type="java:wsaxis.bean.UserBean"
             serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"
             deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"
        encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
       />
  </service>
</deployment>

上面要注意: value="wsaxis.MessageService" , 這個 MessageService 就是你創建的那個 MessageService.java路徑一定不要搞錯 !

       type="java:wsaxis.bean.UserBean", 這個 UserBean 就是你創建的那個 UserBean.java路徑一定不要搞錯 !

4. 創建一個 undeploy.wsdd 文件, 該文件主要用於取消發布 web service , 創建方法同上。 其內容如下

<undeployment
    xmlns="http://xml.apache.org/axis/wsdd/">
  <!-- Services from MessageService WSDL service -->
  <service name="MessageService"/>
</undeployment>

5. 將上面寫好的兩個類已編譯好的class文件復制到 %tomcat_home%/axis/WEB-INF/class/ 目錄下,(注意:要完整的目錄結構復制過來),然后在把兩個wsdd文件復制到%tomcat_home%/axis/WEB-INF/ 目錄下,打開cmd進入 %tomcat_home%/axis/WEB-INF/ 目錄下:

java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient -p 8080 deploy.wsdd 

java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient -p 8080 -s /axis/servlet/AxisServlet deploy.wsdd

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

分別用CMD 輸入如上命令,如果成功系統會提示如下:

Processing file deploy.wsdd
<Admin>Done processing</Admin>

(有可能第三條不成功,但是沒關系,主要看下 %tomcat_home%/axis/WEB-INF/  目錄下是否已經生成 server-config.wsdd 文件) , 如果有此文件 則在瀏覽器輸入

http://localhost:8080/axis/services/MessageService   會看到下圖

 

6. 生成client

打開cmd進入 %tomcat_home%/axis/WEB-INF/ 目錄下:

java -Djava.ext.dirs=lib org.apache.axis.wsdl.WSDL2Java -p client http://localhost:8080/axis/services/MessageService?wsdl

輸入以上命令,會在當前的目錄下生成 client 文件夾,這個目錄里文件就是 客戶端源碼

7.使用 Stubs 方式訪問客戶端 實現如下:

package wsaxis;

import java.net.URL;
import javax.xml.namespace.QName;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.ser.BeanDeserializerFactory;
import org.apache.axis.encoding.ser.BeanSerializerFactory;
import wsaxis.bean.UserBean;

public class TestStubClient {
    
     /**
      *@see    axis框架實現簡單的 Stubs方式 webService客戶端, 讀取基於WSDD方式生成的webServicez服務器內容
     * @param namespaceURI 命名空間URL
     * @param localPart 本地部分名
     * @param method 要調用的方法名
     * @param wsdlUrl 服務的絕對路徑
     * @param userBean 用戶實體
     * @author 鄧龍勝(微信simpledls)
     * @date 2015.12.11
     * @throws Exception
     */
    public static void readerWebserviceContent(String namespaceURI,String localPart,String method,
            String wsdlUrl,UserBean userBean) throws Exception {
        
        QName qname = new QName(namespaceURI,localPart);
        Service s = new Service();
        Call call = (Call) s.createCall();
        // 注冊這個bean為可序列化的.傳遞參數x
        call.registerTypeMapping(UserBean.class, qname,new BeanSerializerFactory(UserBean.class, qname),
                new BeanDeserializerFactory(UserBean.class, qname));
        // 設置一下調用方法名.
        call.setOperationName(method);
        // 設置一下這個服務的絕對路徑.
        call.setTargetEndpointAddress(new URL(wsdlUrl));
        // 通知方法,並返回結果
        String str = (String) call.invoke(new Object[] {userBean});
        System.out.println("web service 返回信息:\n" + str);
    }
    
    /**
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {
        String namespaceURI = "http://wsaxis.michael.com";
        String localPart = "denglongsheng";
        String method = "getBeanStr";
        String wsdlUrl = "http://localhost:8080/axis/services/MessageService?wsdl";
        //實例化一個UserBean,這個UserBean是生成client的UserBean
        UserBean userBean = new UserBean();
        userBean.setAge(33);
        userBean.setUserName("DLSssadf");
        //調用讀取的方法
        TestStubClient.readerWebserviceContent(namespaceURI, localPart, method, wsdlUrl, userBean);
    }

}

 

五.通過WSDD文件卸載發布的 webservice

1.打開cmd進入%tomcat_home%/axis/WEB-INF/目錄下:
java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient undeploy.wsdd

2.如果不是默認8080端口需要加上參數: -p 8082
java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient -p 8082 undeploy.wsdd

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

六. 完。

 


免責聲明!

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



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