首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

三步快速將 Java 程式轉為 Web Service:Axis 實戰指南

     編輯:Java 相關知識

核心流程:三步完成 Java 到 Web Service 的轉換

想要將現有的 Java 類別發布為 Web Service?使用 Apache Axis 只需三個關鍵步驟即可完成:

  1. 編譯 Java 檔案:選擇目標 Java 檔案並編譯生成 .class 檔案。
  2. 撰寫 WSDD 部署描述檔:定義服務名稱、實作類別、允許的方法等部署資訊。
  3. 發布服務:使用 Axis 管理工具部署 WSDD,服務即刻上線。

完成部署後,客戶端只需透過 wsdl2java 工具根據 WSDL 生成 Stub 程式碼,即可輕鬆呼叫遠端服務。這種分層架構讓前台頁面、控制邏輯、資料傳輸與處理徹底解耦,特別適合將 CICS 等後台系統逐層封裝現代化。

環境準備與 Axis 安裝

所需環境

  • J2SE SDK 1.3 或 1.4(建議 1.4.2)
  • Servlet 容器:Tomcat 5.0 或以上版本

安裝步驟

  1. 從 Axis 官網 下載安裝包。
  2. 解壓縮後,將 webapps 目錄下的 axis 資料夾複製到 TOMCAT_HOME/webapps/ 下。
  3. 啟動 Tomcat,瀏覽器訪問 https://localhost:8080/axis 驗證安裝是否成功(預設會顯示 Axis 歡迎頁與可用服務列表)。

Axis 支援的三種開發模式

Axis 提供三種 Web Service 部署與呼叫方式,適用於不同場景:

模式特點適用場景
Dynamic Invocation Interface (DII)客戶端動態構建呼叫,無需預先生成 Stub快速原型、動態發現服務
Stubs 方式預先生成強型別 Stub,編碼體驗佳正式專案、團隊協作開發
Dynamic Proxy 方式基於介面的動態代理,程式碼更簡潔介面導向設計、解耦合需求高

實戰範例一:DII 模式開發 Hello World 服務

1. 撰寫服務端類別

public class HelloClient {
    public String getName(String name) {
        return "hello " + name;
    }
}

2. 部署為 .jws 檔案

將編譯後的類別檔複製到 AXIS_HOME 目錄下,並重新命名為 HelloClient.jws。Axis 會自動偵測並發布。

3. 驗證 WSDL 生成

瀏覽器訪問 https://localhost:8080/axis/HelloClient.jws?wsdl,即可看到 Axis 自動生成的 WSDL 文檔。

4. 撰寫 DII 客戶端

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

public class TestHelloClient {
    public static void main(String[] args) {
        try {
            String endpoint = "https://localhost:8080/axis/HelloClient.jws";
            Service service = new Service();
            Call call = (Call) service.createCall();
            call.setOperationName(new QName("https://localhost:8080/axis/HelloClient.jws", "getName"));
            call.setTargetEndpointAddress(new java.net.URL(endpoint));
            String ret = (String) call.invoke(new Object[] {"張三"});
            System.out.println("return value is " + ret);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

實戰範例二:Dynamic Proxy 模式呼叫服務

1. 定義遠端介面

public interface HelloClientInterface extends java.rmi.Remote {
    public String getName(String name) throws java.rmi.RemoteException;
}

2. 客戶端透過 ServiceFactory 獲取代理

import javax.xml.rpc.Service;
import javax.xml.rpc.ServiceFactory;
import java.net.URL;
import javax.xml.namespace.QName;

public class TestHelloClient {
    public static void main(String[] args) {
        try {
            String wsdlUrl = "https://localhost:8080/axis/HelloClient.jws?wsdl";
            String namespaceUri = "https://localhost:8080/axis/HelloClient.jws";
            String serviceName = "HelloClientService";
            String portName = "HelloClient";

            ServiceFactory factory = ServiceFactory.newInstance();
            Service service = factory.createService(new URL(wsdlUrl), new QName(namespaceUri, serviceName));
            HelloClientInterface proxy = (HelloClientInterface) service.getPort(new QName(namespaceUri, portName), HelloClientInterface.class);

            System.out.println("return value is " + proxy.getName("John"));
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

實戰範例三:WSDD 部署 + Stub 客戶端(企業級標準做法)

1. 服務實作類別

package server;
public class SayHello {
    public String getName(String name) {
        return "hello " + name;
    }
}

2. 自訂 Handler 記錄存取日誌

import org.apache.axis.AxisFault;
import org.apache.axis.Handler;
import org.apache.axis.MessageContext;
import org.apache.axis.handlers.BasicHandler;
import java.util.Date;

public class LogHandler extends BasicHandler {
    public void invoke(MessageContext msgContext) throws AxisFault {
        try {
            Handler serviceHandler = msgContext.getService();
            Integer numAccesses = (Integer) serviceHandler.getOption("accesses");
            if (numAccesses == null) numAccesses = new Integer(0);
            numAccesses = new Integer(numAccesses.intValue() + 1);
            Date date = new Date();
            String result = date + ": service " + msgContext.getTargetService() + " accessed " + numAccesses + " time(s).";
            serviceHandler.setOption("accesses", numAccesses);
            System.out.println(result);
        } catch (Exception e) {
            throw AxisFault.makeFault(e);
        }
    }
}

3. 撰寫 deploy.wsdd 部署描述檔

<deployment xmlns="https://xml.apache.org/axis/wsdd/"
    xmlns:java="https://xml.apache.org/axis/wsdd/providers/java">
    <handler name="print" type="java:LogHandler"/>
    <service name="sayhello" provider="java:RPC">
        <requestFlow>
            <handler type="print"/>
        </requestFlow>
        <parameter name="className" value="server.SayHello"/>
        <parameter name="allowedMethods" value="*"/>
    </service>
</deployment>

4. 部署與生成 Stub

  1. 將編譯好的 server 與 LogHandler 類別複製到 AXIS_HOME/WEB-INF/classes。
  2. 執行部署指令:
    java org.apache.axis.client.AdminClient deploy.wsdd
  3. 生成客戶端 Stub(兩種方式擇一):
    • 方式一(從 .jws):java org.apache.axis.wsdl.WSDL2Java -p client https://localhost:8080/axis/services/SayHello.jws?wsdl
    • 方式二(從 Java 類別):
      java org.apache.axis.wsdl.Java2WSDL -o SayHello.wsdl -l https://localhost:8080/axis/services/SayHello -n sayhello server.SayHello
      java org.apache.axis.wsdl.WSDL2Java SayHello.wsdl -p client

生成的 Stub 檔案包含:SayHello.java、SayHelloService.java、SayHelloServiceLocator.java、SayHelloSoapBindingStub.java。

5. 撰寫並執行客戶端

public class SayHelloClient {
    public static void main(String[] args) {
        try {
            SayHelloService service = new client.SayHelloServiceLocator();
            client.SayHello_PortType client = service.getSayHello();
            String retValue = client.getName("張三");
            System.out.println(retValue);
        } catch (Exception e) {
            System.err.println("Execution failed. Exception: " + e);
        }
    }
}

進階:server-config.wsdd 完整配置範例

生產環境通常直接編輯 server-config.wsdd 以集中管理所有服務與全域設定(如密碼、附件處理、傳輸協定等)。以下為關鍵片段:

<deployment xmlns="https://xml.apache.org/axis/wsdd/"
    xmlns:java="https://xml.apache.org/axis/wsdd/providers/java">
    <globalConfiguration>
        <parameter name="adminPassword" value="admin"/>
        <parameter name="sendXsiTypes" value="true"/>
        <parameter name="sendMultiRefs" value="true"/>
        <parameter name="sendXMLDeclaration" value="true"/>
    </globalConfiguration>
    <handler name="print" type="java:stub.LogHandler"/>
    <service name="sayhello" provider="java:RPC">
        <requestFlow><handler type="print"/></requestFlow>
        <parameter name="className" value="stub.server.SayHello"/>
        <parameter name="allowedMethods" value="*"/>
    </service>
    <transport name="http">
        <requestFlow>
            <handler type="URLMapper"/>
            <handler type="java:org.apache.axis.handlers.http.HTTPAuthHandler"/>
        </requestFlow>
    </transport>
</deployment>
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved