AxisによるWebサービスのサンプル

Apache Axisは、 Apache XML ProjectによるオープンソースのSOAP (Simple Object Access Protocol)の実装です。

インストール・動作確認方法

  1. 上記のサイトからaxis-1_1rc2.tar.gzをダウンロードし、 任意のディレクトリで展開します。
  2. 展開して作られたサブディレクトリ 「axis-1_1rc2/webapps/axis」をサーブレットコンテナの アプリケーション配備ディレクトリ (例えば、Jakarta Tomcatなら$CATALINA_HOME/webapps) の下にコピーします。 以後、使用するサーブレットコンテナはJakarta Tomcat(4.1台) としそのトップディレクトリを$CATALINE_HOME、 そのポートを8765とします。 また、この(axis)ディレクトリを$AXIS_APP_HOMEと呼ぶことにします。
  3. 別途、JAF(JavaBeans Activation Framework) のjarファイル(activation.jar)にCLASSPATHを通しておきます。 簡単には、$CATALINA_HOME/lib に activation.jarをコピーして配置します。
  4. Jakarta Tomcatを起動します。
  5. http://localhost:8765/axis/ にアクセスし、Axis のホームページが表示されることを確認します。

JWSを使った簡単なWebサービスを実装する

  1. $AXIS_APP_HOME の下に、Javaソースプログラム(.jws) を書いて配置します。 コンパイル処理等は不要です。
  2. http://localhost:8765/axis/{.jwsファイル名} でアクセスすると、「There is a Web Service here.」 というページが出ます。 「Click to see the WSDL」 というリンクを辿ると、MSIEなどのXML対応のブラウザではWSDLが生成されて表示されます。 (Netscape 7.0などでは、白いページになりますが、「ソースを表示」 でWSDLを見ることができます)
    ここで「AXIS error」というページが表示されると、.jwsファイルに書いた Javaコードにコンパイルエラーがあるという意味なので、修正します。

    public class MonthName {
      private static final String[] monthNames = {
        "", "Jan", "Feb", "Mar", "Apr", "May", "Jun",
        "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
      };
    
      /**
       * 月(1〜12)から月の名前の省略形を返します。
       */
      public String getName(int n){
        return (n >= 1 && n <= 12) ? monthNames[n] : null;
      }
    
      /**
       * 月の名前の省略形から月(1〜12)を返します。
       */
      public int getNumber(String monthName){
        int n = 0;
        for(int i=1; i<=12; i++){
          if(monthNames[i].equals(monthName.trim())){
            n = i; break;
          }
        }
        return n;
      }
    }
    /* end. */
    

  3. 任意のディレクトリで、WebServiceクライアント Javaアプリケーションを開発します。

    import javax.xml.rpc.*;
    import javax.xml.rpc.encoding.*;
    import javax.xml.namespace.*;
    
    public class MonthNameClient {
    
      private static void getMonthName(Call call, int m)
      throws java.rmi.RemoteException {
        Object[] callArgs;
        String ret;
        call.setOperationName(new QName("getName"));
        call.addParameter("m", XMLType.XSD_INTEGER, ParameterMode.IN);
        call.setReturnType(XMLType.XSD_STRING);
        callArgs = new Object[] {new Integer(m)};
        ret = (String) call.invoke(callArgs);
        System.out.println("正常に取得しました:[" + ret + "]");
        call.removeAllParameters();
      }
    
      private static void getMonthNumber(Call call, String monthName)
      throws java.rmi.RemoteException {
        Object[] callArgs;
    
        call.setOperationName(new QName("getNumber"));
        call.addParameter("monthName", XMLType.XSD_STRING, ParameterMode.IN);
        call.setReturnType(XMLType.XSD_INT);
        callArgs = new Object[] { monthName };
        int m = ((Integer)call.invoke(callArgs)).intValue();
        System.out.println("正常に取得しました:[" + m + "]");
        call.removeAllParameters();
      }
    
      public static void main(String[] args){
        Service service;
        Call call;
    
        if(args.length != 3){
          System.err.println("usage: java MonthNameClient {endpointURL} {cmd} {param}");
          return;
        }
    
        String endpointURL = args[0];
    
        try {
          ServiceFactory factory = ServiceFactory.newInstance();
          service = factory.createService(null);
          call = (Call) service.createCall();
          call.setTargetEndpointAddress(endpointURL);
    
          ((org.apache.axis.client.Call)call).setTimeout(new Integer(30*1000));
          ((org.apache.axis.client.Call)call).setMaintainSession(true);
          if(args[1].equals("get-month-name")){
            getMonthName(call, Integer.parseInt(args[2]));
          }
          else if(args[1].equals("get-month-number")){
            getMonthNumber(call, args[2]);
          }
          else{
            System.err.println("unrecognized command: " + args[1]);
            System.err.println("'get-month-name' and 'get-month-number' are available.");
            return;
          }
        } catch(Exception ex){
          ex.printStackTrace();
        }
      }
    }
    /* end. */
    

  4. $AXIS_APP_HOME/WEB-INF/lib にある、次のJARファイルに全て CLASSPATHを通します。 axis.jar、commons-discovery.jar、commons-logging.jar、 jaxrpc.jar、saaj.jar
  5. javacでコンパイルします。
  6. javaでクライアントを実行します。

XML Top

(first uploaded 2003/04/27 last updated 2003/05/17, URANO398)

テレワークならECナビ Yahoo 楽天 LINEがデータ消費ゼロで月額500円〜!
無料ホームページ 無料のクレジットカード 海外格安航空券 海外旅行保険が無料! 海外ホテル