Webサービス2(入門チュートリアル)


1.5     JAX-RPC開発WEBサービス概要
JAX-RPCはJava API for XML-Based RPC(Java XMLベースのリモート・プロシージャ呼び出しAPI)の略で、javaプラットフォーム上でWEBサービスを開発する上で重要な技術規範である.他のJAVA技術仕様と同様に、JAX-RPC自体はクラスとインタフェースのセットにすぎないため、JAX-RPCを用いた開発は、仕様を具体的に実現したプラットフォームで行う必要がある.
JAX−RPCは、SOAP 1.1仕様に基づくWEBサービスのサーバ側およびクライアントの開発に使用することができる.JAX-RPCはSOAPプロトコルに基づくWEBサービスを開発するための簡単なプログラミングモデルを提供し、Webサービスの多くの技術的詳細を遮断し、開発者は下位プロトコルを理解する必要がなく、Webサービスの開発を行うことができる.JAX-RPCは、WSDLをJAVAコードにマッピングしたり、JAVAコードをWSDLにマッピングしたりするツールも提供しています.
      Apache AXIS 1.XはJAX-RPCのオープンソース実装であり、ここではAXISを用いてWEBサービスを開発する.Webサービスの開発には2つのモデルがある:1、契約優先モデル;2プログラム優先モード;契約優先とは,まずWSDLでサービスを定義し,その後WSDLに基づいてプログラムを記述し,プログラム優先モードではプログラムをプログラミングし,ツールでプログラムをWebサービスにパブリッシュすることである.AXIS 1.Xは第2のモードを採用し,Javaでコードを記述してからWebサービスに公開する.
    前述したように、RPCやWebサービスは、Webサービスとして配布されるプログラムを作成する際に考慮する必要はない.ほとんどのWebサービスは最初はWebサービスとして開発されたものではありません.実際には、呼び出し時に値を返す方法を含む一般的なプログラムです.この概念を熟知している場合は、仮想マシンのみがアクセスできるプログラムではなく、Webサービスの本質を理解していることを示します.
したがって、RPC構文またはWeb Services Description Language(WSDL)に注目する前に、Webクライアントで使用できるクラスが必要です.
     仮に、貸付年限、貸付金額、金利に基づいて総利息を計算できるWebサービスを開発する必要があるとしたら、Webサービスを全く考慮せずに、簡単なjavaクラスを書いて利息を計算すればいいのです.
 
public class CalculateInterest {

  public float calculate(float credit,int year,float rate){

             return credit*year*rate;

  }

}

 
 このコードは、あまり説明する必要はありません.とても簡単なPOJOです.続いてAXIS 1.XでこのPOJOをWEBサービスにリリースします.AXISでは、Webサービスを公開するための即時公開と定義の2つの導入方法を提供しています.ここでは、CalculateInterestクラスをWebサービスに公開するために、カスタム公開方法について説明します.Webサービスの公開は、CalculateInterest.javaをCalculateInterest.jwsに名前を変更し、AXIS 1.X実行環境を導入したWebアプリケーションにコピーするだけで完了します.Webサービスがありますが、誰がこのサービスを利用しますか?もちろんクライアントです.次にCalculateInterestサービスのクライアントを開発します.JAX-RPC仕様の要件に従ってクライアントはjavax.xml.rpc.Callとjavax.xml.rpc.Serviceの2つのインタフェースを使用してサーバ側の呼び出しを実現し、AXIS 1.Xはこの2つのインタフェースの実装クラスorg.apache.axis.client.Callとorg.apache.axis.client.Serviceを提案し、この2つの実装クラスを使用してWebサービスのクライアントを簡単に構築することができます.次に、CalculateInterestサービスのクライアントコードを示します.
 
import java.io.IOException;

import javax.xml.namespace.QName;

import org.apache.axis.client.Call;

import org.apache.axis.client.Service;

import javax.xml.rpc.ServiceException;

 

public class CalculateInterestClient {

 

         public static final String 

        SERVICE_URL = "http://localhost:8080/AXIS_WS/CalculateInterest.jws";

         

         public float calculate(Float credit, Integer year, Float rate)

                            throws IOException {

                   try {

                            Service service = new Service();

                            Call call = (Call) service.createCall();

                            call.setTargetEndpointAddress(SERVICE_URL);

                            call.setOperationName(new QName("http://DefaultNamespace",

                                               "calculate"));

                            Object result = call.invoke(new Object[] { credit, year, rate });

                            if (result instanceof Float && result != null)

                                     return ((Float) result).floatValue();

                            else

                                     return -1f;

                   } catch (ServiceException e) {

                            throw new IOException("Error creating service call: "

                                               + e.getMessage());

                   }

         }

 

         public static void main(String[] args) {

                   CalculateInterestClient client = new CalculateInterestClient();

                   try {

                            System.out.println(client.calculate(100000f, 10,0.0523f));

                   } catch (IOException e) {

                            e.printStackTrace();

                   }

         }

}

 まずサービスクラスを作成し、Callを作成し、Callインスタンスがアクセスするネットワークのエンドポイントを指定し、Webサービスの具体的な操作のWSDLでの限定名を設定します(ここでは限定名の問題をあまり気にしないで、後で説明します).この限定名には、ローカル名calculateと名前空間の2つの部分が含まれています.http://DefaultNamespace 次にinvokeメソッドを呼び出すと,Webサービスへの呼び出しが実現される.
 
上記のコードから見るとWSLDとは何の関係もありません.これはAXIS 1.XがAXISデフォルトのRPCサービス方式でWebサービスにアクセスしているためです.このWebサービスもちょうど採用されているRPC方式で対外サービスを提供していますが、実際にはすべてのWebサービスが採用されているという保証はありませんので、AXISはWSDLに基づいてクライアントコードを生成できるツールを提供しています.カスタマイズされたパブリッシュサービスについて説明するセクションでは、このツールについて説明します.
この例では,AXIS 1.XがWebサービスを理解することなく,Webサービスの下位層のパッケージを実現していることがわかる.しかし、このような即時配信方式を採用するのは簡単だが柔軟ではなく、実際のアプリケーションに適応できない場合が多い.例えば、Javaには複数の公有メソッドがあり、1つのメソッドをWebサービスに配信するだけで、即時配信を使用するとすべての公有メソッドが暴露され、AXISが提供するカスタム配信が必要になる場合が多い.
カスタマイズされた発表を簡単に説明するために、鉄道列車の運賃を計算するサービスを開発する必要があると仮定します.このサービスは入力されたキロ数に基づいて運賃を計算することができます.1キロ当たりの運賃は0.075元で、コストのほかに15%の利益があります.このサービスには2つの方法があります.1つはコストを計算するために使用され、もう1つは利益を加えた運賃を計算するために使用されます.コストを計算する方法はWebサービスとして公開されるべきではないが,同じjvmのクラスがこの方法にアクセスできる必要がある.前の例と同様に、このWebサービスのプログラムはPOJOにすぎません.コードは以下の通りです.
 
package railway;

 

public class TicketSvr {

  public float ticketPrice(float journey){

         return ticketCostPrice(journey)*(1+0.15f);

  }

  public float ticketCostPrice(float journey){

         return journey*0.075f;

  }

}

 TicketSvrをコンパイルしてclassファイルをAXISのWebアプリケーションが配備されているWEB-INF/classesディレクトリにコピーします.TicketSvrをWebサービスに公開するためには、カスタム方式でサービスを公開するにはdeploy.wsddというXMLファイルを作成する必要があります.その内容は:
 
<deployment xmlns="http://xml.apache.org/axis/wsdd/"

            xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">

 <service name="TicketSvr" provider="java:RPC">

   <parameter name="className" value="railway.TicketSvr"/>

   <parameter name="allowedMethods" value="ticketPrice"/>

 </service>

</deployment>

 
 AXISを配備したWebアプリケーションを起動し、AXISが提供するコマンドを使用します.
 
java org.apache.axis.client.AdminClient -lhttp://localhost:8080/AXIS_WS/services/AdminService deploy.wsdd

 このコマンドは、WEB-INFディレクトリのserver-config.wsddファイルに対応する構成を追加し、ブラウザでアクセスします.http://localhost:8080/AXIS_WS/services/TicketSvr?wsdlにはTicketSvrのWSDLが見えます.ここではAXISが提供するツールWSDL 2 Javaを使用してクライアントのコードを生成します.AXISを導入したWebアプリケーションを起動し、WEB-INF/libディレクトリのjarパッケージをすべてクラスパスに追加し、次のコマンドを実行します.
 
 
 
java -Djava.ext.dirs=lib http://localhost:8080/AXIS_WS/services/TicketSvr?wsdl
 
 
 
 
このコマンドはlocalhost/AXIS_WS/services/TicketSvrディレクトリでは、次の4つのjavaファイルが生成されます.
TicketSvr.java Webサービスのインタフェースは、ticketPriceしかありません.
TicketSvrServices.javaサービスインタフェースファクトリのインタフェースは、サービスインタフェースを生成する方法を定義します.
TicketSvrServiceLocator.java TicketSvrServiceインタフェースの実装クラス;
TicketSvrSoapBindingStub.javaはネットワーク通信を実現し、具体的にWebサービスを呼び出す.
これらの生成されたクラスを呼び出すだけで,Webサービスへの呼び出しを実現できる.次はWebサービスにアクセスするクライアントコードです.
 
import java.rmi.RemoteException;

 

import javax.xml.rpc.ServiceException;

 

import localhost.AXIS_WS.services.TicketSvr.*;

 

public class TicketSvrClient {

 

       public static void main(String[] args) throws ServiceException,

                     RemoteException {

              TicketSvrService ticketService = new TicketSvrServiceLocator();

              TicketSvr ticketSvr = ticketService.getTicketSvr();

              System.out.println("1100 km price is " + ticketSvr.ticketPrice(1100f));

       }

 

}

 
 JAX-RPCを使用することでWebサービスの開発を大幅に簡素化することができるが、JAX-RPCはRPCモードのWebサービスの開発に適しているが、異機種システム統合の面ではドキュメントモードに基づくWebサービスを採用することが多く、技術発展に適応するためにJAX-WS規格が提案されている.以下の章では更新されたJAX-WS規格について紹介する.